【问题标题】:C# - check if substring is present in arraylist of stringsC# - 检查字符串数组列表中是否存在子字符串
【发布时间】:2018-12-10 16:13:58
【问题描述】:

假设我有一个像下面这样的 Arraylist(arr1)

 "String1 is present"
 "String2 is present"
 "String3 is present"

我想看看这个数组列表中是否存在“String2”。我做了如下的事情:

        var containsstringmatch = arr1.OfType<string>().Any(arg=>arg.Contains("String2"));

        if (containsstringmatch==true)
        {
            IEnumerable v1 = arr1.OfType<string>().Where(arg=>arg.Contains("String2"));

            foreach (string s in v1)
            {
                st1 = s;
            }

            Console.WriteLine(st1);
        }

这给了我以下很好的输出:

"String2 is present"

我想看看这是否可以在我不使用 foreach 循环的情况下实现。有人可以提供有关如何操作的建议。

谢谢

【问题讨论】:

  • 嘿,不知道代码的意图是什么。显然,您所做的不仅仅是检查子字符串是否存在于任何字符串中。你应该像你的代码那样输出数组中包含子字符串的每个值还是只输出最后一个值?
  • 相关或重复stackoverflow.com/questions/200574/… BTW,你应该把旅游原码的Console.Writeline放在foreach里面

标签: c# arraylist


【解决方案1】:

如果只想打印包含搜索的第一个字符串,可以使用FirstOrDefault()

var foundString =  arr1.OfType<string>().FirstOrDefault(arg => arg.Contains("String2"));
Console.WriteLine(string.IsNullOrEmpty(foundString) ? "Not found" : foundString);

此外,正如 Aomine 在他的回答中所写的那样 - 当我们使用 .Net 1.1 时,ArrayLists 非常好。由于 .Net 2.0 引入了泛型,因此应避免使用 ArrayList。

正如 Rufus L 在他的评论中所写,您当前的代码获取包含搜索字符串的 last 字符串,而不是第一个。如果你想要最后一个而不是第一个,你可以简单地使用LastOrDefault 而不是FirstOrDefault

【讨论】:

  • 我拥有的数组列表将始终只有一个字符串实例(我发布的上面只是一个示例。实际的数组列表将具有每个以特定值开头的字符串,我无法在此处共享。我的目标是根据匹配标准从数组列表中实际提取一个特定的字符串,然后再对其进行一些验证)。
  • 好吧,在这种情况下,FirstOrDefaultLastOrDefault 是等价的。
【解决方案2】:

在当今时代,我会避免在 .NET 中使用 ArrayList,而是倾向于使用 List&lt;T&gt;如果可能)。

至于:

我想看看是否可以在不使用 foreach 的情况下实现这一点 循环。

如果你的意思是你想避免foreach 构造并内联执行所有操作:

arr1.OfType<string>()
    .Where(arg => arg.Contains("String2"))
    .ToList()
    .ForEach(s => Console.WriteLine(s));

或者如果您只想找到满足上述条件的最后一个元素:

var result = arr1.OfType<string>().LastOrDefault(arg => arg.Contains("String2"));

【讨论】:

  • 这会迭代两次吧?另外,OP 想避免 foreach 循环,我不确定使用 ForEach 扩展方法会更好
  • @maccettura 当 OP 说“我想看看是否可以在没有我使用 foreach 循环的情况下实现这一点”我认为他们想避免 foreach 构造并内联做所有事情......但也许我错了吗?
【解决方案3】:

如果没有foreachfor 循环,就无法做到这一点。但是您可以创建一个扩展方法,将代码移出您的方法。

public static class ConsoleExtensions
{
    public static void WriteToConsole(this IEnumerable<string> list)
    {
        foreach (string item in list)
            Console.WriteLine(item);
    }
}

用法:

arr1.OfType<string>().Where(arg=>arg.Contains("String2")).WriteToConsole();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多