4

わかりましたので、異なるタイプのアイテムのリストが 2 つあります。

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 を取得します。

これらのクエリの書き方を誰か教えてもらえますか?

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

集合演算からユニオン演算を利用できます。

これを使用するには、デフォルトの等値比較子と 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メソッドによる 2 つの Left Join が必要です。

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 に答える