4

私は LINQ にかなり慣れていないので、ここで自分自身を隅に描いた可能性があります。2 つのリスト (左右) があり、次のことを行う必要があります。

a)特定のフィールドに基づいて一致するアイテムを取得する

b ) 右側に一致しないアイテムを左側に取得します

c ) 左側に一致しないアイテムを右側に取得します

特定のフィールドが等しい場合、一致が見つかります。他のフィールドには値が含まれる場合と含まれない場合がありますが、一致比較に影響を与えてはなりません。

アイテムを取得するには、両方のリストでaを実行しました。JOIN

var q = from a in r1
        from b in r2
        where a.Prop1 == b.Prop1 && a.Prop3 == b.Prop3
        select new { a.Prop1, a.Prop2, b.Prop3 };

ここからどこへ行けばいいのかわからない。両方のリストの他のプロパティが異なり、比較が壊れる可能性があるため、使用できないと思います.Except()

Left Joinまた、一致しないアイテムを使用して取得しようとしました:

 var q =
     from c in r1
     join p in r2 on c.Prop1 equals p.Prop1
     into cp
     from p in cp.DefaultIfEmpty()
     select new { Prop1 = c.Prop1, Prop2 = p == null ? "N/A" : p.Prop2 };

ただし、複数のフィールドを比較して比較することはできないことがわかりました。

Left JoinLINQで複数のフィールドを持つことはできますか? 2 つのリストの違いを取得する他の方法 (LINQ 以外) はありますか?

4

3 に答える 3

4

これはIntersectandを使用しますExcept(Cuong Leのソリューションと同様):

public class MyComparer : IEqualityComparer<YourClass>
{
    #region IEqualityComparer<YourClass> Members

    public bool Equals(YourClass x, YourClass y)
    {
        return
            x.Prop1.Equals(y.Prop1) && x.Prop3.Equals(y.Prop3);
    }

    public int GetHashCode(YourClass obj)
    {
        int hCode = obj.Prop1.GetHashCode() ^ obj.Prop3.GetHashCode();
        return hCode.GetHashCode();
    }

    #endregion
}

// matched elements from both lists
var r1 = l1.Intersect<YourClass>(l2, new MyComparer());
// elements from l1 not in l2
var r2 = l1.Except<YourClass>(l2, new MyComparer());
// elements from l2 not in l1
var r3 = l2.Except<YourClass>(l1, new MyComparer());
于 2012-09-26T09:45:15.473 に答える
2

デフォルトでは、ExceptメソッドはEqualityComparer.Defaultを使用します。そのため、異なるプロパティ値を持つオブジェクトがある場合は使用できません。

ただし、カスタマイズ する場合を除いて、別のオーバーロードメソッドを使用できます。EqualityComparer<T>無視すると仮定します。Pro3

public class CustomComparer : EqualityComparer<A>
{
    public override int GetHashCode(A a)
    {
        int hCode = a.Pro1.GetHashCode() ^ a.Pro2.GetHashCode();
        return hCode.GetHashCode();
    }

    public override bool Equals(A a1, A a2)
    {
        return a1.Pro1.Equals(a2.Pro1) && a1.Pro2.Equals(a2.Pro2)
    }
}

次に、使用できますExcept

listA.Except(listB, new CustomComparer());
于 2012-09-26T09:41:53.560 に答える
0

どうですか

a)

r1.Where(x=>r2.Any(y=>x.Prop1==y.Prop1&&x.Prop3==y.Prop3))
    .Select(x=>new { x.Prop1,x.Prop2,x.Prop3});

b)

r1.Where(x=>!r2.Any(y=>x.Prop1==y.Prop1&&x.Prop3==y.Prop3))
    .Select(x=>new { x.Prop1,x.Prop2,x.Prop3});

c)

r2.Where(x=>!r1.Any(y=>x.Prop1==y.Prop1&&x.Prop3==y.Prop3))
    .Select(x=>new { x.Prop1,x.Prop2,x.Prop3});
于 2012-09-26T09:41:36.897 に答える