好的,所以我有两个不同类型的项目列表。
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.然后我想得到没有匹配螃蟹的鲸鱼,即鲸鱼Id = 5。
谁能告诉我如何编写这些查询?
答案 0 :(得分:8)
如果你只想选择螃蟹。
var result = crabs.Where(c => whales.All(w => w.Id != c.Id));
答案 1 :(得分:4)
也许是这样的:
var unmatchedCrabs = from c in crabs
where !whales.Any(w => w.Id == c.Id)
select c;
答案 2 :(得分:2)
您需要outer join:
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;
答案 3 :(得分:1)
您可以使用Union operation中的set operations。
要使用它,您必须覆盖默认Equality comparer and GetHashCode method。一旦你有了那些,那么你可以做这样的事情:
var matchedPair = crabs.Union(whales);
在你的情况下,你应该有一个基类;例如具有平等比较的动物。另一种选择是实施IEqualityComparer<>
答案 4 :(得分: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});
答案 5 :(得分: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 };
答案 6 :(得分: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});
然后,按照您想要的结果过滤结果。