2017-10-18 118 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