2014-11-22 80 views
0

我有超過1200萬個元素的列表列表myList。 myClass有兩個屬性,即。 「gt」和「gm」。 我想找到最大的「gt」元素,並選擇具有min「gm」的元素。 forexample: 讓myList中,例如:(第一列是GT另一個克)如何對多個列表屬性進行排序?

4 1 
    5 2 
    7 1 
    8 3 
    4 3 
    2 2 
    8 7 
    1 7 
    8 2 

我想獲得具有GT = 8的MyClass的元件,GM = 2。 我可以從哪裏開始?是否按照降序排列高效的方式?

+0

如果您正在尋找一個元素,排序不是一種有效的方法。 O(2n)= O(n) Mephy 2014-11-22 19:36:11

+0

此問題已被解答 - 請參閱[這裏](http://stackoverflow.com/questions/1101841/linq-how-to-perform-max-on-a-property-of-all-objects-in-a -collection-and-ret) – user2008934 2014-11-22 19:48:07

回答

2
myList.OrderByDescending(x => x.gt)         
     .ThenBy(x => x.gm) 
     .First(); 

一個更有效的,但不太會使用Enumerable.Aggregate它迭代收集一次readbale方式,從而執行O(n)的時間:

var seed = myList.First() 
myList.Aggregate(seed, 
     (max, item) => { 
      if(item.gt > max.gt) 
       return item; 
      if(item.gt == max.gt && item.gm < max.gm) 
       return item; 
      return max; 
     }); 

之前與更持續有效的方法,衡量兩者並確保可讀性性能折衷是值得的。

+0

謝謝answering.unallow在「if(item.gt> max.gt)」時,當我將鼠標懸停在「item」上時它給出「nullreferenceexception is unhandled」異常,它爲null。 – Myesil 2014-11-22 20:33:05

+0

@Myesil這是因爲你的列表包含空項目。只需在調用'Aggregate' /'OrderByDescending'前鏈接'.Where(item => item!= null)', – dcastro 2014-11-22 20:51:40

相關問題