2013-05-09 68 views
3

例如,如果我有對象的列表具有以下屬性如何選擇屬性A的最高值的對象,按屬性B分組?

No Grouper Sorter 
1  X  3 
2  X  2 
3  X  1 
4  Y  3 
5  Y  2 
6  Y  5 
7  Z  4 

我想要的結果包含對象中沒有圖3(X具有最高分選),無5(Y具有最高分選器),而且沒有7(Z具有最高的分揀機,那麼這裏沒有其他選擇)。

No Grouper Sorter 
3  X  1 
5  Y  2 
7  Z  4 

我該怎麼做,例如,使用Linq?沒有Linq,我也不介意是否有乾淨簡單的解決方案。

+0

不要以爲這是一個重複。 – 2013-05-09 07:40:02

+0

@Liam不,不是。我添加了我的預期結果,澄清 – 2013-05-09 07:40:05

回答

3
var result = list.GroupBy(x=>x.Grouper) 
       .Select(x=>x.OrderBy(y=>y.Sorter).First()) 
       .ToList(); 
2

所以,你要group由石斑魚,然後爲每個組由order分揀機,並保持first結果。使用鏈接,您應該能夠拼湊的東西,喜歡的東西下面結束了:

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Thing> things = new List<Thing>() 
      { 
       new Thing(){ No = 1, Grouper = 'X', Sorter = 3 }, 
       new Thing(){ No = 2, Grouper = 'X', Sorter = 2 }, 
       new Thing(){ No = 3, Grouper = 'X', Sorter = 1 }, 
       new Thing(){ No = 4, Grouper = 'Y', Sorter = 3 }, 
       new Thing(){ No = 5, Grouper = 'Y', Sorter = 2 }, 
       new Thing(){ No = 6, Grouper = 'Y', Sorter = 5 }, 
       new Thing(){ No = 7, Grouper = 'Z', Sorter = 4 } 
      }; 

      var test = from thing in things 
         group thing by thing.Grouper into thingGroup 
         select thingGroup.OrderBy(tg => tg.Sorter).First(); 

      foreach (var thing in test) 
      { 
       Console.WriteLine(thing); 
      } 

      Console.ReadKey(); 
     } 
    } 

    class Thing 
    { 
     public int No { get; set; } 
     public char Grouper { get; set; } 
     public int Sorter { get; set; } 

     public override string ToString() 
     { 
      return string.Format("No: {0}, Grouper: {1}, Sorter: {2}", 
           No, Grouper, Sorter); 
     } 
    } 
} 

輸出:

No: 3, Grouper: X, Sorter: 1 
No: 5, Grouper: Y, Sorter: 2 
No: 7, Grouper: Z, Sorter: 4