代码之家  ›  专栏  ›  技术社区  ›  DarthVegan

morelinq exceptby只有一个匹配属性

  •  0
  • DarthVegan  · 技术社区  · 6 年前

    我有两个不同的项目,我正在尝试执行,除了使用更多LINQ库的方法。两个项目之间唯一常见的是一个称为符号的字符串。项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);
    

    这不起作用,因为项1和项2是完全不同的类型

    无法从用法中推断方法“moreenumerable.exceptby(ienumerable,ienumerable,func)”的类型参数。尝试指定类型 显式参数。

    1 回复  |  直到 6 年前
        1
  •  1
  •   spender    6 年前

    我有一个扩展方法可以方便地进行左外部连接:

    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)
    

    …这将为我们提供tuple列表中的所有项 Symbol 属性,该属性在另一个列表中没有具有相同项的对应项 符号 。对吗?