2014-11-22 78 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

相关问题