我对LINQ有一个简单的问题,但没有找到直接解决我的问题的答案。假设我有一个任意的对象集合:{cat, apple, orange, cat, orange, apple, cat}
。我想订购使用LINQ按相等顺序订购这些列表,例如因此现在该集合显示为{apple, apple, orange, orange, cat, cat, cat}
。类型是什么顺序无关紧要(例如,苹果是第一还是猫),只有将它们适当地分组即可。
说我可以访问Equals()或一些布尔方法来确定两个实例是否相等。我该怎么办?
答案 0 :(得分:2)
排序具有复杂性O(n log n)
。以下是线性复杂度。
collection.GroupBy(x => x).SelectMany(g => g).ToList();
答案 1 :(得分:1)
只需对列表进行排序。由于相等的元素按顺序具有相同的排名,因此它们将被分组在一起:
var items = new []{"cat", "apple", "orange", "cat", "orange", "apple", "cat"};
var sorted = items.OrderBy(x => x);
结果:
苹果苹果猫猫猫橙色橙色
答案 2 :(得分:1)
由于您可以访问Equals()且它有效,因此必须重写GetHashCode()并可以立即使用。因此,您可以按object.GetHashCode()进行排序,它将为您提供结果。
代码就像@zhulien的答案。
collection.OrderBy(o => o.GetHashCode());
答案 3 :(得分:0)
var values = new List<string> { "cat", "apple", "orange", "cat", "orange", "apple", "cat" };
var orderedAlphabetically = values.OrderBy(v => v);
答案 4 :(得分:0)
在阿德里安所说的话之外,
如果您想将它们分组在一起...
var items = new []{"cat", "apple", "orange", "cat", "orange", "apple", "cat"};
var sorted = items.GroupBy(x => x).OrderBy(x => x).Select(x => x);
您现在有3个不同的组,按其计数排序
苹果橙猫
您可以进一步遍历该组
foreach (var x in sorted)
{
foreach (var y in x)
{
Console.Write(y);
}
}
苹果苹果橙橙猫猫猫
答案 5 :(得分:-2)
一种快速的解决方案是按对象哈希码排序。该代码应类似于:
collection.OrderBy(o => o.GetHashCode());
另一种选择是使用GroupBy
通过Equality,HashCode或某些自定义的Comparer函数对对象进行分组,然后再次展平集合。
collection.GroupBy(o => o.GetHashCode()).SelectMany(o => o);
或
collection.GroupBy(o => o, <CustomComparerFunction>).SelectMany(o => o);