2017-10-18 6 views
0

同じ値を持つ異なるインスタンスから別のオブジェクトリストを取得しようとしています。私は別名とグループを使用しようとしました。私は作業によってグループを手に入れましたが、オブジェクトを更新するときに関数を書き直したくありません。オブジェクトのすべてのプロパティでグループ化する

// my object: 
    public class dummyObject 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
    [TestMethod] 
    public void dummytest() 
    { 
     // my list: 
     var list = new List<dummyObject> 
     { 
      new dummyObject{ Id = 1, Name = "derp" }, 
      new dummyObject{ Id = 2, Name = "derp" }, 
      new dummyObject{ Id = 1, Name = "flerp" }, 
      new dummyObject{ Id = 1, Name = "derp" }, 
     }; 
     // this wont work, unless I override the GetHashCode and Equals function 
     var result = list.Distinct(); // count = 4 
     Assert.AreEqual(4, result.Count()); 
     // this will work if I group by all the properties that matter 
     var result2 = list 
     .GroupBy(x => new { x.Id, x.Name }) 
     .Select(x => x.First()); 
     Assert.AreEqual(3, result2.Count()); 
    } 

さらに重要なプロパティをすべて指定する必要はありません。追加が増える可能性があり、このメンテナンスを抑えたいからです。私はいつもすべてのプロパティを使いたいと思っています。

私がやろうとしていることをする良い方法がありますか?または、GetHashCodeEqualsの機能をグループ化またはオーバーライドしてスタックしていますか?

+0

'dummyObject'クラスのユースケースについてはわかりませんが、' Distinct'メソッドを 'Equals' /' GetHashCode'メソッドでオーバーライドする必要があります。作業。 –

+1

遅い方法は '.GroupBy(x => JsonConvert.SerializeObject(x))' –

+0

'dummyObject'を' class'の代わりに 'struct'にすることができますか? – Vikhram

答えて

1

独自のコンパレータを作成し、GetHashCode関数とEquals関数をオーバーライドする必要があります。その周りには方法がありません。あなたがそれを伝えないと、どのプロパティでアサーションすることはできません。結局のところ、オブジェクトでありプリミティブではない

+1

私は、[IComparer ](https://msdn.microsoft.com/en-us/library/8ehhxeaf(v = vs.110).aspx)と[IEquatable ](https: //msdn.microsoft.com/en-us/library/ms131187(v=vs.110).aspx)。 –

+0

私はそれに同意します – Picnic8

関連する問題