.NET 6 LINQ IntersectBy、ExceptBy用法及CS0411编译错误咨询
.NET 6 LINQ IntersectBy/ExceptBy 报错原因及使用示例
报错原因
你触发CS0411错误的核心原因是 IntersectBy、ExceptBy 与 UnionBy 的方法签名设计不一致:
UnionBy的第二个参数是和第一个集合同类型的元素集合- 而
IntersectBy、ExceptBy的第二个参数要求是键类型的可枚举集合,而非原元素类型的集合
你直接传入了List<Example>类型的elements2,编译器无法匹配泛型参数,因此抛出类型推断失败的CS0411错误。
正确使用示例
如果你要实现和UnionBy逻辑一致的效果:按X字段对比两个Example集合,求交集、差集,只需要提前提取第二个集合的键序列即可:
namespace Test { internal struct Example { public int X { get; set; } public int Y { get; set; } public override string ToString() { return $"{X}, {Y}"; } } public class Program { public static void Main() { var elements = new List<Example> { new Example { X = 10, Y = 20 }, new Example { X = 11, Y = 23 }, }; var elements2 = new List<Example> { new Example { X = 10, Y = 12 }, new Example { X = 44, Y = 20 }, }; // UnionBy 逻辑不变 var union = elements.UnionBy(elements2, x => x.X); Console.WriteLine("UnionBy结果:"); foreach (var item in union) { Console.WriteLine(item); } // 输出: // 10, 20 // 11, 23 // 44, 20 // 正确的IntersectBy写法:提前提取第二个集合的键序列 var intersect = elements.IntersectBy(elements2.Select(x => x.X), x => x.X); Console.WriteLine("\nIntersectBy结果:"); foreach (var item in intersect) { Console.WriteLine(item); } // 输出:10, 20 // 正确的ExceptBy写法:提前提取第二个集合的键序列 var except = elements.ExceptBy(elements2.Select(x => x.X), x => x.X); Console.WriteLine("\nExceptBy结果:"); foreach (var item in except) { Console.WriteLine(item); } // 输出:11, 23 Console.ReadKey(); } } }
补充说明
IntersectBy、ExceptBy 这种设计也支持直接用独立的键集合过滤第一个集合,不需要额外构造元素集合,比如你要过滤出elements里X值为10、11的元素,直接写即可:
var filterKeys = new List<int>{10,11}; var filterResult = elements.IntersectBy(filterKeys, x=>x.X);
内容的提问来源于stack exchange,提问作者webmaster442
相关产品推荐
相关产品推荐

