在c#中的字符串列表中查找一个字符串
Posted
技术标签:
【中文标题】在c#中的字符串列表中查找一个字符串【英文标题】:Find a string in a list of strings in 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 的信息,但对于这种情况并没有多大意义。 提前致谢。
【问题讨论】:
【参考方案1】:最简单的方法是单独搜索每个字符串:
bool exists = s1.Any(s => s.Contains(s2));
List<string>.Contains()
方法将检查是否有任何 whole 字符串与您要求的字符串匹配。您需要检查每个单独的列表元素以完成您想要的。
请注意,如果您的列表中包含大量元素、非常长的字符串,尤其是在您要搜索的字符串不存在或找到的情况下,这可能是一个耗时的操作仅在列表末尾附近。
【讨论】:
请注意这是一个耗时的操作,.Any(
将在第一个 true
返回后停止处理,因此在 OP 的示例中,它仅在第一个字符串上调用 Contains。同样对于大型列表,这是使用 AsParallel()
将搜索拆分到多个线程 bool exists = s1.AsParallel().Any(s => s.Contains(s2));
的好例子
@ScottChamberlain:完全正确。这就是为什么我用“大量元素”或“长字符串”来限定我的评论,并写道“特别是在您正在搜索的字符串......仅在列表末尾附近找到的情况下”。性能取决于要处理的数据量,以及代价高昂的迭代可以多早终止。在给出的示例中,这根本不重要。即使根本没有找到字符串,也没有足够的数据来注意到成本。 真实世界的例子可能完全不同。是的,如果您有空闲的 CPU 内核,并发会有所帮助。
并解释Predicate<>
问题,而Any<>
是一个Linq 方法,其中lambda 箭头在这种情况下键入为Func<string, bool>
,List<>
类也有一个较旧的Exists
实例方法,其中相同的箭头获取类型 Predicate<string>
。在引入 Func<,>
委托类型之前,根据上下文使用不太通用的委托类型。【参考方案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 执行此操作并指定分隔符,则可以降低您提到的那些不正确结果的风险以上是关于在c#中的字符串列表中查找一个字符串的主要内容,如果未能解决你的问题,请参考以下文章