我有一组对象,我希望使用如下所示的方法来比较它们:
bool AreEqual(MyObject O1,MyObject O2);
对所有同等对象进行分组的最友好的表现方式是什么?显而易见的答案是将每个对象与集合中的所有其他对象进行比较,但这会影响性能(N ^ N,我相信)。
LINQ group by operator能否提供解决方案?
编辑:
我应该将MyObject命名为MyObject,因为我无法修改它的实现(并且它没有实现IComparable)。这意味着我可能会使用ICR的解决方案。
答案 0 :(得分:7)
您不需要将每个对象与每个其他对象进行比较,您需要将每个对象与每个组进行比较(例如,组中的第一项)并创建一个新组(如果它与任何对象不匹配)(或者如果这是第一项。
可能看起来像:
public static IEnumerable<IEnumerable<T>> Group<T>(IEnumerable<T> items)
where T : IEquatable<T>
{
IList<IList<T>> groups = new List<IList<T>>();
foreach (T t in items)
{
bool foundGroup = false;
foreach (IList<T> group in groups)
{
Debug.Assert(group.Count() >= 1);
if (group[0].Equals(t))
{
group.Add(t);
foundGroup = true;
break;
}
}
if (!foundGroup)
{
IList<T> newGroup = new List<T>() { t };
groups.Add(newGroup);
}
}
foreach (IList<T> group in groups)
{
yield return group;
}
}
当然,这已经在Linq为您完成了,人们已经在上面概述了如何使用。我只想证明算法比将每个项目与每个项目进行比较要好一些。
N.B。该算法依赖于等式关系是传递性的假设 - 即,如果a等于b,并且b等于c,则a等于c。虽然我不太确定如何将非传递性项目分组。
答案 1 :(得分:3)
我建议将IComparable interface用于MyObject类,然后尝试对其进行分组,例如完成here或here
答案 2 :(得分:2)
如果您打算使用LINQ,可以使用IEqualityComparer。 Here是使用IComparer和IEqualityComparer
的示例我会使用LINQ来比较所有元素。如果你想获得一个不同对象的列表,我会这样做(伪代码)