使用MoreLinq ExceptBy处理不同类型对象:仅匹配Symbol属性报错
解决MoreLinq ExceptBy类型推断错误的方案
我来帮你搞定这个类型推断的问题~
你遇到的报错是因为MoreLinq的ExceptBy方法在处理不同类型的集合时,编译器没办法自动推断泛型参数的类型——你的源集合(Item1)是元组类型,而你传入的第二个参数是Item2.Select(k => k.Symbol)得到的字符串集合,类型差异让编译器摸不清该用什么泛型参数。下面给你两种可行的解决方案:
方案一:显式指定泛型参数
直接告诉编译器源元素的类型和键的类型,消除歧义。
- 如果你的Item1是具名元组(比如
(string Symbol, string Market, List<Class1>, List<Class2>)),代码修改为:Item1.ExceptBy<(string Symbol, string Market, List<Class1>, List<Class2>), string>(Item2.Select(k => k.Symbol), e => e.Symbol); - 如果是普通非具名Tuple(即
Tuple<string, string, List<Class1>, List<Class2>>),需要用Item1访问元组的第一个元素(也就是你的Symbol字段):Item1.ExceptBy<Tuple<string, string, List<Class1>, List<Class2>>, string>(Item2.Select(k => k.Symbol), e => e.Item1);
方案二:使用更友好的ExceptBy重载(推荐)
MoreLinq提供了另一个ExceptBy重载,允许你直接传入第二个集合(Item2),并分别指定两个集合的键选择器。这样编译器能自动推断所有泛型参数,代码更简洁易读:
Item1.ExceptBy(Item2, item1 => item1.Symbol, item2 => item2.Symbol);
这个重载的逻辑完全匹配你的需求:找出所有Item1中Symbol不存在于Item2的Symbol中的元素,而且不需要手动提取键集合,也不用显式指定泛型类型。
补充说明:这个重载的签名为
public static IEnumerable<TSource> ExceptBy<TSource, TOther, TKey>(this IEnumerable<TSource> source, IEnumerable<TOther> other, Func<TSource, TKey> sourceKeySelector, Func<TOther, TKey> otherKeySelector);,编译器可以从Item1、Item2以及两个键选择器的返回值自动推断出TSource、TOther和TKey的类型,因此不会再出现类型推断错误。
内容的提问来源于stack exchange,提问作者DarthVegan
相关产品推荐
相关产品推荐

