3

我有 2 个不同的项目,我正在尝试使用 more linq 库执行 except by 方法。两个项目之间唯一的共同点是一个名为 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 是完全不同的类型

无法从用法中推断方法“MoreEnumerable.ExceptBy(IEnumerable, IEnumerable, Func)”的类型参数。尝试明确指定类型参数。

4

1 回答 1

3

我保留了一个扩展方法来方便地进行左外连接:

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。正确的?

于 2018-05-23T23:47:08.700 回答