c# – 按等号分组对象

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

bool AreEqual(MyObject O1,MyObject O2);

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

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

编辑:

我应该将MyObject命名为MyObject,因为我无法修改它的实现(并且它没有实现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.虽然我不太确定如何将非传递性项目分组.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...