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.虽然我不太确定如何将非传递性项目分组.
总结以上是内存溢出为你收集整理的c# – 按等号分组对象全部内容,希望文章能够帮你解决c# – 按等号分组对象所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)