【问题标题】:Find a string in a list of strings in c#在c#中的字符串列表中查找一个字符串
【发布时间】:2015-02-18 21:56:06
【问题描述】:

我正在尝试查找字符串列表是否包含 C# 中的特定字符串。 例如:假设我的列表中有 3 个条目

list<string> s1 = new List<string>(){
  "the lazy boy went to the market in a car", 
  "tom", 
  "balloon"};
string s2 = "market";

现在我想在 s1 包含 s2 时返回 true,在这种情况下它会这样做。

return s1.Contains(s2);

这会返回 false,这不是我想要的。我正在阅读有关 Predicate 的信息,但对于这种情况并没有多大意义。 提前致谢。

【问题讨论】:

    标签: c# string list


    【解决方案1】:

    最简单的方法是单独搜索每个字符串:

    bool exists = s1.Any(s => s.Contains(s2));
    

    List&lt;string&gt;.Contains() 方法将检查是否有任何 whole 字符串与您要求的字符串匹配。您需要检查每个单独的列表元素以完成您想要的。

    请注意,如果您的列表中包含大量元素、非常长的字符串,尤其是在您要搜索的字符串不存在或找到的情况下,这可能是一个耗时的操作仅在列表末尾附近。

    【讨论】:

    • 请注意这是一个耗时的操作,.Any( 将在第一个 true 返回后停止处理,因此在 OP 的示例中,它仅在第一个字符串上调用 Contains。同样对于大型列表,这是使用 AsParallel() 将搜索拆分到多个线程 bool exists = s1.AsParallel().Any(s =&gt; s.Contains(s2)); 的好例子
    • @ScottChamberlain:完全正确。这就是为什么我用“大量元素”或“长字符串”来限定我的评论,并写道“特别是在您正在搜索的字符串......仅在列表末尾附近找到的情况下”。性能取决于要处理的数据量,以及代价高昂的迭代可以多早终止。在给出的示例中,这根本不重要。即使根本没有找到字符串,也没有足够的数据来注意到成本。 真实世界的例子可能完全不同。是的,如果您有空闲的 CPU 内核,并发会有所帮助。
    • 并解释Predicate&lt;&gt; 问题,而Any&lt;&gt; 是一个Linq 方法,其中lambda 箭头在这种情况下键入为Func&lt;string, bool&gt;List&lt;&gt; 类也有一个较旧的Exists 实例方法,其中相同的箭头获取类型 Predicate&lt;string&gt;。在引入 Func&lt;,&gt; 委托类型之前,根据上下文使用不太通用的委托类型。
    【解决方案2】:

    包含的替代方案可能是 IndexOf:

    var res = s1.Any(s => s.IndexOf(s2, StringComparison.Ordinal) >= 0)
    

    StringComparison.Ordinal 作为参数传递,因为 Contains() 也在内部使用它。

    【讨论】:

      【解决方案3】:

      Peter Duniho 的回答通常是最好的方法。我正在提供替代解决方案。这个不需要 LINQ、lamdas 或循环。这只需要string 内置类型的方法。

      string.Concat(listOfString).Contains("data");
      

      注意:这种方法可能会导致错误的结果。例如:

      string.Concat("da", "ta").Contains("data");
      

      当它应该为假时将返回真;

      【讨论】:

      • 如果您改为使用 Join 执行此操作并指定分隔符,则可以降低您提到的那些不正确结果的风险
      猜你喜欢
      • 2012-11-23
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2019-11-17
      • 2018-09-27
      相关资源
      最近更新 更多