MoreLinq ExceptBy只有一个匹配的属性

时间:2018-05-23 23:32:10

标签: c# linq tuples morelinq

除了使用更多linq库的方法之外,我还有两个不同的项目。两个项目之间唯一共同点是名为Symbol的单个字符串。第1项是元组列表,第2项是我用linq打开的数据库表

第1项:

Tuple<string Symbol, string Market, List<Class1>, List<Class2>>

第2项:

List<TableClass>

TableClass {
string Symbol;
decimal Price;
bool isSold; }

这是我尝试过的代码。我试图返回Item1中不存在于Item2中的所有元素:

Item1.ExceptBy(Item2.Select(k => k.Symbol), e => e.Symbol);

这不起作用,因为Item1和Item2是完全不同的类型

  

方法的类型参数&#39; MoreEnumerable.ExceptBy(IEnumerable,IEnumerable,Func)&#39;无法从使用中推断出来。尝试指定类型   明确的论点。

1 个答案:

答案 0 :(得分:1)

我保留一个扩展方法,方便做左外连接:

public static IEnumerable<TResult> LeftOuterJoin<TLeft, TRight, TKey, TResult>(
    this IEnumerable<TLeft> leftSeq,
    IEnumerable<TRight> rightSeq,
    Func<TLeft, TKey> keySelectorLeft,
    Func<TRight, TKey> keySelectorRight,
    Func<TLeft, TRight, TResult> projectionSelector)
{
    return leftSeq
        .GroupJoin(
            rightSeq,
            keySelectorLeft,
            keySelectorRight,
            (leftItem, rightItems) => new { leftItem, rightItems })
        .SelectMany(
            x => x.rightItems.DefaultIfEmpty(),
            (x, rightItem) => projectionSelector(x.leftItem, rightItem));
}

现在我们可以:

tuples.LeftOuterJoin(list, t => t.Symbol, k => k.Symbol, (t,k) => (t,k))
      .Where(x => x.k == null)
      .Select(x => x.t)

...这将为我们提供元组列表中的所有项目,其中Symbol属性在另一个列表中没有相应的项目,且具有相同的Symbol。正确?