2017-10-18 153 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()); 
    } 

我不想指定所有重要的屬性,因爲可能會添加更多的屬性,並且我希望保持這種低維護。我知道我會一直想要使用所有的屬性。

有沒有更好的方式做我想做的事情?或者我堅持使用Group by或覆蓋GetHashCodeEquals函數?

+0

我不知道的情況下,使用您的'dummyObject'類,但也許你需要重寫'Equals' /'GetHashCode'方法,使'Distinct'會工作。 –

+1

緩慢的方式是'.GroupBy(X => JsonConvert.SerializeObject(X))' –

+0

你能'dummyObject'一個'struct'而不是'class'? – Vikhram

回答

1

您必須製作自己的比較器並覆蓋GetHashCode和Equals函數。沒有辦法解決這個問題,如果你不告訴它,那麼Distinct函數就不能在哪些屬性中斷言。這是一個對象,而不是原始畢竟

+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