Tes*_*stK 2 c# list nested-lists
说我有以下列表:
List 1:
{{"John", "Doe", "Tall", "Old"},
{"John", "Doe", "Short", "Old"},
{"Jane", "Doe", "Tall", "Young"},
{"Jane", "Doe", "Short", "Old"}}
Run Code Online (Sandbox Code Playgroud)
我想在列表中搜索{"John","Doe","Short","Old"}.
搜索此嵌套列表条目的最佳方法是什么,并确保我不会获得{"John","Doe","Tall","Old"}?
如果嵌套列表只包含一个string项而不是四个,我将使用LINQ展平列表并搜索结果List<string>.ie:
List<string> newList = oldList.SelectMany(x => x).Distinct().ToList();
newList.Contains("string");
Run Code Online (Sandbox Code Playgroud)
我可以为每个嵌套列表包含多个字符串项的列表做些类似的事情吗?
那么列表必须包含该顺序中的所有字符串?然后你可以使用Enumerable.SequenceEqual.如果顺序并不重要的用途Enumerable.All有Contains,那么:
var names = new[]{"John", "Doe", "Short", "Old"};
List<List<string>> result = list
.Where(l => l.SequenceEqual(names)).ToList();
Run Code Online (Sandbox Code Playgroud)
要么
result = list
.Where(l => l.All(name => names.Contains(name))).ToList();
Run Code Online (Sandbox Code Playgroud)
输出:
foreach(List<string> l in result)
Console.WriteLine(string.Join(",", l)); // John,Doe,Short,Old
Run Code Online (Sandbox Code Playgroud)
旁注:如果将要搜索的集合转换为以下内容,则可以使第二种方法更有效HashSet<T>:
var names = new HashSet<string>(new[]{"John", "Doe", "Short", "Old"});
result = list.Where(l => l.All(names.Contains)).ToList();
Run Code Online (Sandbox Code Playgroud)
正如Servy所提到的,第二种方法并不能阻止你获得包含所有项目的列表,而且还有更多.您可以添加一个Count检查以确保它.
| 归档时间: |
|
| 查看次数: |
279 次 |
| 最近记录: |