按等号分组对象

我有一个对象的集合,我想使用如下所示的方法比较相等:

bool AreEqual(MyObject O1,MyObject O2);

将所有相等对象分组的最友好的表现方式是什么? 显而易见的答案是将每个对象与集合中的所有其他对象进行比较,但这会影响性能(N ^ N,我相信)。

LINQ group by operator能提供解决方案吗?

编辑:

我应该将MyObject命名为MyObject,因为我无法修改它的实现(并且它没有实现IComparable)。 这意味着我可能会使用ICR的解决方案。

您不需要将每个对象与每个其他对象进行比较,您需要将每个对象与每个组进行比较(例如,组中的第一个项目),如果它与任何对象不匹配,则创建一个新组(或者如果它是第一个项目)。

可能看起来像:

public static IEnumerable> Group(IEnumerable items) where T : IEquatable { IList> groups = new List>(); foreach (T t in items) { bool foundGroup = false; foreach (IList group in groups) { Debug.Assert(group.Count() >= 1); if (group[0].Equals(t)) { group.Add(t); foundGroup = true; break; } } if (!foundGroup) { IList newGroup = new List() { t }; groups.Add(newGroup); } } foreach (IList group in groups) { yield return group; } } 

当然,这已经在Linq中为您完成了,人们已经在上面概述了如何使用。 我只是想certificate算法比将每个项目与每个项目进行比较要好一些。

NB该算法依赖于等式关系是传递性的假设 – 即如果a等于b,并且b等于c,则a等于c。 虽然我不太确定如何将非传递性项目分组。

我建议为MyObject类使用IComparable接口 ,然后尝试对其进行分组,例如在此处或此处完成

如果您计划使用LINQ,则可以使用IEqualityComparer 。 以下是使用IComparer和IEqualityComparer的示例

我会使用LINQ来比较所有元素。如果你想获得一个不同对象的列表,我会这样做(伪代码)

  1. 实现IEqualityComparer,比如说ObjectEqualityComparer实现IEqualityComparer
  2. var result = sourceList.Distinct(objectEqualityComparer的一个实例)