LINQ Select 从 collection 降序排列,三个不同的值上升到元素的最大值

LINQ Select in descending order from collection, three different values that go up to the maximum value of the element

例如我有一个这样的collection

var c1 = new Collection<int>{0,0,2,2,2,3,3,4,4,4,4,5,5,6,6,7};  

我想得到这样的结果

(6,5,4)

你可以这样做:

c1.Distinct()
    .OrderByDescending(x => x)
    .Skip(1)
    .Take(3)
    .ToList()

先把重复的全部去掉,再进行沮丧排序。 Skip(1) 以便删除最大元素。最后你可以从剩下的元素中取出 3 个元素。

在过去,在 LINQ 出现之前,我们可能会像您那样对排序集合执行此操作:

var maxes = new int[4];
var idx = 0;
var max = 0;
foreach(var c in c1)
  if(c > max)
    max = maxes[(idx++)%4] = c;

最后,您将得到一个包含 4 个最大值的数组 - 3 个是您想要的,另一个是您不需要的(在 (idx - 1) % 4 中)。我不知道我现在是否会使用它,但它比“区分,然后排序,然后跳过然后采用”方法更有效,因为它在一次通过中完成工作