2011-04-22 116 views
0

假设我有一类“Person” .........获取所需的对象......

public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

,并假设我有列表“listOfPerson”含有说15人......

List<Person> listOfPerson = new List<Person>(); 

现在,我试图让对象人形成此列表与Max Age ... ..

仔细阅读我不只是需要最大年龄...... 但整个对象......所以我也可以访问最大年龄......的人的名字。

感谢.........

回答

4
Person oldest = listOfPerson.OrderByDescending(person => person.Age).First(); 

从评论

并假设我 说....所有最大 年龄的人......有年龄上限(人名单 从给定的人名单)?谢谢

在这种情况下,它是值得的,找到最大年龄,然后过滤它。有各种方法,但一个简单的方法是

int maxAge = listOfPerson.Max(person => person.Age); 
var oldestPeople = listOfPerson.Where(person => person.Age == maxAge); // .ToList() 

包括可选的扩展ToList()如果这个结果是一个列表,而不是一个IEnumerable<Person>是很重要的。

+1

哈,哈,你用 “无功”!再次击败我五秒!完全相同的答案! – 2011-04-22 05:33:09

+0

瞬间滑倒。星期五发生。 – 2011-04-22 05:35:14

+0

@Anthony Pegram ,,假设我说....所有最大年龄的人...(最大年龄从给定人名单的人名单)?谢谢... – Pritesh 2011-04-22 05:48:26

1
listOfPerson.OrderByDescending(x=>x.Age).First(); 
1

如果列表很短,那么排序并选择第一个(如前所述)可能是最简单的。

如果你有一个更长的列表并且排序开始变慢(这可能不太可能),你可以编写自己的扩展方法来做到这一点(我使用MaxItem,因为我认为Max会与现有的LINQ方法冲突,但我懒得弄清楚)。

public static T MaxItem<T>(this IEnumerable<T> list, Func<T, int> selector) { 
    var enumerator = list.GetEnumerator(); 

    if (!enumerator.MoveNext()) { 
     // Return null/default on an empty list. Could choose to throw instead. 
     return default(T); 
    } 

    T maxItem = enumerator.Current; 
    int maxValue = selector(maxItem); 

    while (enumerator.MoveNext()) { 
     var item = enumerator.Current; 
     var value = selector(item); 

     if (value > maxValue) { 
      maxValue = value; 
      maxItem = item; 
     } 
    } 

    return maxItem; 
} 

或者,如果你需要返回所有的最大项目:

public static IEnumerable<T> MaxItems<T>(this IEnumerable<T> list, Func<T, int> selector) { 
    var enumerator = list.GetEnumerator(); 

    if (!enumerator.MoveNext()) { 
     return Enumerable.Empty<T>(); 
    } 

    var maxItem = enumerator.Current; 
    List<T> maxItems = new List<T>() { maxItem }; 
    int maxValue = selector(maxItem); 

    while (enumerator.MoveNext()) { 
     var item = enumerator.Current; 
     var value = selector(item); 

     if (value > maxValue) { 
      maxValue = value; 
      maxItems = new List<T>() { item }; 
     } else if (value == maxValue) { 
      maxItems.Add(item); 
     } 
    } 

    return maxItems; 
}