我有一个对象集合,我想使用如下所示的方法来比较它们的相等性:
bool AreEqual(MyObject O1, MyObject O2);
将所有相同对象分组的最性能友好的方式是什么?显而易见的答案是将每个对象与集合中的所有其他对象进行比较,但这会损害性能(我相信 N ^ N)。
LINQ group by Operator 能否提供解决方案?
EDIT:
我也许应该将 MyObject 命名为 TheirObject,因为我无法修改它的实现(并且它没有实现 IComparable)。这意味着我可能会使用 ICR 的解决方案。
您不需要将每个对象与每个其他对象进行比较,您需要将每个对象与每个组(例如组中的第一个项目)进行比较,如果不匹配任何对象(或者如果它是第一个项目),则创建一个新组物品)。
可能看起来像这样:
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 中为您完成了,上面已经概述了如何使用它。我只是想证明该算法比将每个项目与每个项目进行比较要好一些。
注意:该算法依赖于等式关系是传递的假设——即,如果 a 等于 b,并且 b 等于 c,则 a 等于 c。虽然我不太确定如何对非传递性项目进行分组。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)