4

好的,所以我有两个不同类型的项目列表。

var whales = new List<Whale>();

var crabs = new List<Crab>();

所以他们都有 id 属性。因此,保存列表的对象 ID 为:

鲸鱼:1、3、4、5 螃蟹:1、2、3、4

好的,所以我有一个查询:

var matchedPairs = from c in crabs
                   from w in whales
                   where c.Id = w.Id
                   select new { crab = c, whale = w };

因此,这对于获取匹配项非常有效。我遇到麻烦的地方是我想获得一份没有匹配鲸鱼的螃蟹列表,即。Crab Id = 2。然后我想得到没有匹配螃蟹的鲸鱼,即 Whale Id = 5。

谁能告诉我如何编写这些查询?

4

7 回答 7

9

如果您只想选择螃蟹。

var result = crabs.Where(c => whales.All(w => w.Id != c.Id));
于 2012-08-01T02:57:52.200 回答
4

也许是这样的:

var unmatchedCrabs = from c in crabs
                     where !whales.Any(w => w.Id == c.Id)
                     select c;
于 2012-08-01T02:51:47.977 回答
2

你想要一个外部连接

var crabsWithoutWhales = from c in crabs
                         join w1 in whales on c.Id equals w1.Id into ws
                         from w2 in ws.DefaultIfEmpty()
                         where w2 == null
                         select c;
于 2012-08-01T03:09:38.990 回答
1

您可以使用集合操作中的联合操作。

要使用它,您必须覆盖默认的Equality 比较器和 GetHashCode 方法。一旦你有了这些,你就可以做这样的事情:

var matchedPair = crabs.Union(whales);

在您的情况下,您应该有一个基类;例如具有平等比较器的动物。另一种选择是实施IEqualityComparer<>

于 2012-08-01T02:56:39.777 回答
0
var result = crabs.SelectMany(c => whales, (c, w) => new { c, w })
                              .Where(@t => whales.All(x => x.Id != t.c.Id) && crabs.All(x => x.Id != t.w.Id))
                              .Select(@t => new {crab = @t.c, whale = @t.w});
于 2012-08-01T03:06:00.520 回答
0

这是我能想到的最整洁的 LINQ,可以满足您的需求:

var whalesOnly =
    from w in whales
    join c in crabs on w.Id equals c.Id into gcs
    where !gcs.Any()
    select w;

var crabsOnly =
    from c in crabs
    join w in whales on c.Id equals w.Id into gws
    where !gws.Any()
    select c;

这些看起来如何?

顺便说一句,您可以像这样更好地执行连接查询:

var whalesAndCrabs =
    from whale in whales
    join crab in crabs on whale.Id equals crab.Id
    select new { crab, whale };
于 2012-08-01T03:10:47.417 回答
0

您需要两个通过GroupJoin方法进行的左连接,如下所示:

var result1 = whales.GroupJoin(crabs, w => w.ID, c => c.ID, (w,cs) => new {WhaleID = w.ID, Matches = cs});
var result2 = crabs.GroupJoin(whales, c => c.ID, w => w.ID, (c, ws) => new {CrabID = c.ID, Matches = ws});

然后,按您想要的过滤结果。

于 2012-08-01T03:51:59.267 回答