2017-03-02 203 views
1

有最大值,然后才能所以我有一个List<Tuple<string, integer>>C#列表顺序由排按升序

A 10 
A 11 
B 12 
B 13 

我希望下面的结果

B 12 
B 13 
A 10 
A 11 

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

乙最高值是13
最高值是11

这意味着,B就必须A.但B之前运行容纳12和13,所以它需要按升序运行。所以

B 12 
B 13 

然后

A 10 
A 11 

这可能吗?

所以我需要像

foreach row in list.OrderBy(//order condition) 
{ 
    //do something 
} 

UPDATE:项目2是唯一的,这样2字母表中的机会具有相同的价值是不可能的。

+0

在关系的事件(如果他们有可能),会发生什么? –

+0

@Damien_The_Unbeliever:关系不可能,因为这些都是独一无二的。但如果是这样,那么我不关心哪一个先跑。 – warheat1990

回答

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 
+0

谢谢,任何想法是什么,如果我有组<字符串,字符串,整数>代替组<字符串,整数>我想第一组2串? – warheat1990

+0

@ warheat1990在这种情况下,你可以改变'GroupBy'为'.GroupBy(X =>新{x.Item1,x.Item2})'(然后当然说'所使用的所有地方Item2'现在会说'Item3') –

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(); 
  • 的Gr通过Item1
  • ouping元素搜索最大的各组和最大值递减其组合成新的实例
  • 排序,以便将具有最高值组的第一名
  • 选择结果项,按值升序排序

result将包含所需序列