2011-02-02 56 views
17

比方說,我的最高值不同有如下數據:如何獲得與使用LINQ

Name Priority 
A  3 
A  5 
B  1 
C  1 
C  3 
C  2 

我想獲得具有最高優先級不同的名稱的列表,所以結果看起來像:

Name Priority 
A  5 
B  1 
C  3 

我該如何使用Linq來做到這一點?

回答

17
var query = yourData 
    .GroupBy(x => x.Name, 
      (k, g) => g.Aggregate((a, x) => (x.Priority > a.Priority) ? x : a)); 

// and a quick test... 
foreach (var result in query) 
{ 
    Console.WriteLine(result.Name + " " + result.Priority); 
} 
+2

不知道,如果你是知道的,但LinqPad對於這種快速的片斷是很大的。 – 2011-02-02 11:48:20

+1

好主意與使用投影的GroupBy重載一起使用。可惜沒有MaxBy擴展方法,我們不得不求助於聚合。 – 2011-02-02 11:55:23

+0

@Martinho,我們可以解決這個沒有聚合和使用最大值,檢查我的答案.... – RameshVel 2011-02-03 10:41:05

5

下面是一個替代方法

var items = new List<Tuple<string, int>>() 
{ 
    Tuple.Create("A", 3), 
    Tuple.Create("A", 5), 
    Tuple.Create("B", 1), 
    Tuple.Create("C", 1), 
    Tuple.Create("C", 3), 
    Tuple.Create("C", 2) 
}; 

var results = items.GroupBy(i => i.Item1) 
        .SelectMany(g => g 
         .Where(i => i.Item2 == g.Max(m => m.Item2))) 
        .Distinct(); 

或者如果你喜歡使用C#LINQ語法:

results = (from item in items 
      group item by item.Item1 into groupedItems 
      let maxPriority = groupedItems.Max(item => item.Item2) 
      from element in groupedItems 
      where element.Item2 == maxPriority 
      select element).Distinct(); 
2

另一種簡單的方法,而不聚集

 var listNP = new List<NP>() 
      { 
       new NP() {name="A",priority=3}, 
       new NP() {name="A",priority=5}, 
       new NP() {name="b",priority=1}, 
       new NP() {name="b",priority=1}, 
       new NP() {name="c",priority=3}, 
       new NP() {name="c",priority=2}, 
      }; 

      var np = listNP.GroupBy(x => x.name).Select(y => new 
      { 
       name = y.Key, 
       max = y.Max(x=>x.priority) 

      }).ToList(); 

更新:

var np = listNP.GroupBy(x => x.name) 
      .Select(y => y.OrderByDescending(z => z.priority).First()).ToList();