如何在C#中使用List<int>筛选List<List<int>>集合?
解决方法
你的问题出在Where条件的返回值类型不匹配:内层的x.Where(y => ends.Contains(y))返回的是一个IEnumerable<int>,而外层paths.Where()需要的是**布尔值(bool)**来判断是否保留当前项。
正确的做法是使用Any()方法,它会检查序列中是否存在满足条件的元素,并返回布尔值,完全符合Where的要求:
List<List<int>> paths = new List<List<int>>(); paths.Add(new List<int>() { 0,1 }); paths.Add(new List<int>() { 0, 2 }); paths.Add(new List<int>() { 0, 4 }); paths.Add(new List<int>() { 1, 2 }); paths.Add(new List<int>() { 0, 3 }); List<int> ends = new List<int>(){3,4}; // 正确的筛选代码 var filteredPaths = paths.Where(x => x.Any(y => ends.Contains(y))).ToList(); // 输出验证结果 foreach (var path in filteredPaths) { Console.WriteLine($"{{{string.Join(",", path)}}}"); }
运行后输出结果与预期一致:
{0,4} {0,3}
如果ends中的元素数量较多,建议把它转换成HashSet<int>来优化查询效率——HashSet.Contains()的时间复杂度是O(1),比List.Contains()的O(n)更高效:
HashSet<int> endsSet = new HashSet<int>(ends); var filteredPaths = paths.Where(x => x.Any(y => endsSet.Contains(y))).ToList();
内容的提问来源于stack exchange,提问作者user3094279
相关产品推荐
相关产品推荐

