gpt4 book ai didi

c# - 按对象的所有属性分组

转载 作者:太空宇宙 更新时间:2023-11-03 22:52:31 25 4
gpt4 key购买 nike

我正在尝试从具有相同值的不同实例中获取不同的对象列表。我试过使用不同的和分组依据。我通过工作得到了组,但是我不想在更新对象时重写函数。

    // 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 函数?

最佳答案

创建一个通用的比较器:

public class MyObjectComparer : IEqualityComparer<MyObject>
{
public bool Equals(MyObject a, MyObject b)
{
var properties = a.GetType().GetProperties();
foreach (var prop in properties)
{
var valueOfProp1 = prop.GetValue(a);
var valueOfProp2 = prop.GetValue(b);

if (!valueOfProp1.Equals(valueOfProp2))
{
return false;
}
}

return true;
}

public int GetHashCode(MyObject item)
{
return item.A.GetHashCode();
}
}

并使用它:

var duplicates = myObjectList.GroupBy(t => t, new MyObject.MyObjectComparer()).Where(t => t.Count() > 1).Select(t => t.Key).ToList();

关于c# - 按对象的所有属性分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46815157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com