2

ClassXこの質問のために呼び出されたクラスがあり、次のように宣言されています。

class X 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
}

これらのクラスの2 つのインスタンス (instanceOneおよびinstanceTwo) がList<T>ある場合、両方のインスタンスで同じ要素を見つける方法は次のとおりです。

instanceOne に 2 つの要素があり、instanceTwo に 4 つの要素があるとします。各インスタンスで 2 つの要素が同じである (同じ Guid ID を持つという事実によって定義されている)

私はそれに自分の道をLINQできるはずだと思ったが、これは私のためにそれをやっていない

// What's common to the two instances?
var commonElements = (
    from a in instanceTwo
    join b in instanceOne on a.Id equals b.Id
    select b).ToList();

// What's not in instanceOne and in instanceTwo? 
var notInInstanceOne = instanceTwo.Except(commonElements)

この状況instanceTwoでは のスーパーセットですinstanceOneが、常にそうであるとは限らないため、元の LINQ ステートメントを反転して、 vizinstanceOneにない要素を取得できるはずです。instanceTwo

var notInInstanceTwo = instanceOne.Except(commonElements)

イライラすることに、元の LINQ ステートメント (共通要素を特定しようとする場所) が機能していません。誰かが私が間違っていることを見つけられますか?

編集 2012-06-08 11:00 UTC

@Nikhil Agrawal および @Trust me によると、私は医師です。Intersect メソッドを使用しましたが、期待どおりの結果が得られません。

    var commonItems = instanceTwo.Intersect(instanceOne); // Returns nothing
    var itemsInTwoNotOne= instanceTwo.Except(instanceOne); // Returns everything in instanceTwo

FWIW Equals() メソッドの私の実装は次のとおりです。

public bool Equals(Guid x, Guid y)
{
   if (x == y)
   {
      return true;
   }
   return false;
}
4

2 に答える 2

4

Exceptうまくいけば、

var commonItems = instanceOne.Intersect(instanceTwo);

も動作するはずです。:)

ちなみに、参照を比較するため、別の機能が必要な場合は、独自に実装する必要がありますIEqualityComparerが、Except.

于 2012-06-08T10:15:35.173 に答える
1

intersectを使用して、すべての共通要素のリストを取得できます。Id で要素を識別したいので、 IEqualityComparerも作成する必要があります。

例:

class Program
{
    class X
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }

    class XequalityComparer : IEqualityComparer<X>
    {
        //Note: maybe add a null check in these methods
        public bool Equals(X x, X y) { return x.Id.Equals(y.Id); }
        public int GetHashCode(X obj) { return obj.Id.GetHashCode(); }
    }

    static void Main(string[] args)
    {
        var instanceOne = new List<X>() { 
            new X() { Id = Guid.NewGuid() }, 
            new X() { Id = Guid.Parse("EF42EE32-1B9E-493C-9D39-4610E0FB29D0") } 
        };
        var instanceTwo = new List<X>() { 
            new X() { Id = Guid.NewGuid() }, 
            new X() { Id = Guid.Parse("EF42EE32-1B9E-493C-9D39-4610E0FB29D0") } 
        };

        var common = instanceOne.Intersect(instanceTwo, new XequalityComparer());
    }
}
于 2012-06-08T11:04:16.293 に答える