在字符串列表列表中搜索字符串的最佳方法是什么? 示例I有许多字符串列表,例如List1 List 2等,所有列表都收集在列表列表中(例如ListofLists<,...>。 现在我想在列表列表中搜索字符串“foo”。有没有办法在c#中优化它?
提前致谢
答案 0 :(得分:1)
使用Linq:
检查是否有任何列表包含字符串'foo':
collection.Any(x => x.Contains("foo"));
获取包含字符串'foo'的特定列表:
collection.FirstOrDefault(x => x.Contains("foo"));
答案 1 :(得分:1)
这有用吗?
var listOfLists = new List<List<string>>();
// insert code to populate listOfLists
var containsFoo = listOfLists.SelectMany(x => x).Any(x => x == "foo");
答案 2 :(得分:1)
我只是总结/优化其他答案:
执行此操作的最佳方法是使用LINQ。因此,您可以使用两种方式:
展开列表
这是通过SelectMany
:
listOfLists.SelectMany(x => x).Contains("foo");
SelectMany
将子列表的子元素和子列表的所有元素(等等)合并到一个列表中,这样您就可以检查所有项目,其中包含字符串(https://msdn.microsoft.com/de-de/library/bb534336(v=vs.110).aspx)。
检查所有列表
这是通过Any
:
listOfLists.Any(x => x.Contains("foo"));
Any
检查任何项目是否符合条件(https://msdn.microsoft.com/de-de/library/bb337697(v=vs.110).aspx)。
实际上检查所有列表似乎更有效(使用随机生成的列表,总共有10,000个条目,第一种可能需要34ms,第二种可能需要31)。
在两种可能性中,我使用Contains
,它只是检查,列表中包含元素(https://msdn.microsoft.com/de-de/library/bb352880(v=vs.110).aspx)。
当然你也可以使用循环:
var contains = false;
foreach (var l in listOfLists)
foreach (var i in l)
if (i == "foo")
{
contains = true;
goto end;
}
end:
但这不太可读,效率低,更复杂,也不那么优雅。
然而,如果你不想只是想检查,那么它存在,但用它做多一点,最后一种可能性可能是最简单的。如果您想要针对其他案例的优化版本,请随时指定您的要求。