C#List按行具有最大值的顺序,然后按升序排序

时间:2017-03-02 07:33:57

标签: c#

所以我有List<Tuple<string, integer>>

A 10  
A 11  
B 12  
B 13  

我想要以下结果

B 12  
B 13  
A 10  
A 11  

基本上我想检查哪个字母表保持最高值,在这种情况下

B最高值为13
最高值是11

这意味着B必须在A之前运行。但是B保持12和13,所以它需要按升序运行。所以

B 12  
B 13  

然后

A 10  
A 11  

这可能吗?

所以我需要像

这样的东西
foreach row in list.OrderBy(//order condition)
{
    //do something
}

更新:第2项是唯一的,因此2字母表具有相同值的可能性是不可能的。

2 个答案:

答案 0 :(得分:2)

我想也许这就是你所要求的:

list.GroupBy(x => x.Item1) // Group by Item1
    .OrderByDescending(group => group.Max(x => x.Item2)) // Order the groups by the
                                                         // Max of Item2 (descending)
    .Select(group => group.OrderBy(x => x.Item2)) // Order within the groups
                                                  // by Item2 (ascending)
    .SelectMany(x => x) // Flatten the groups back into a single list

通过结合最后两个步骤,您可以使这更简洁:

list.GroupBy(x => x.Item1)  // group by Item1
    .OrderByDescending(group => group.Max(x => x.Item2)) // Order the groups by Max(Item2)
    .SelectMany(group => group.OrderBy(x => x.Item2)) // Order within groups and flatten

答案 1 :(得分:0)

您似乎需要以下内容:

List<Tuple<string, int>> list = //getting your values

var result = list.GroupBy(x => x.Item1)
                .Select(x => new 
                {
                    MaxValue = x.Max(y => y.Item2),
                    Items = x
                })
                .OrderByDescending(x => x.MaxValue)
                .SelectMany(x => x.Items.OrderBy(y => y.Item2))
                .ToList();
  • Item1
  • 对元素进行分组
  • 搜索每个组的最大值并将其组合到新实例
  • 按最大值desc排序,将具有最高值的组放在第一位
  • 选择结果项目,按值升序排序

result将包含所需的序列