我是.net 3.5的新手.我有一个项目集合:
IListmodels;
哪里
class Model { public string Name { get; private set; } }
我想得到名称长度最长的元素.我试过了
string maxItem = models.Max(model => model.Name.Length);
但它当然会返回最大长度(我需要一个Model
对象).我知道有一种方法可以使用扩展方法,但我不知道如何.
遗憾的是,没有内置的方法可以做到这一点 - 但是编写扩展方法很容易.
事实上,这是我的第一篇博客文章之一......请注意,其中一条评论中有更好的实施方式.如果我有时间,我会把它移到身体里.
编辑:好的,我有一个略有缩写的版本 - 它只返回最大元素,使用给定的选择器.也不需要进行投影 - 如果需要,可以在之后做一次.请注意,您可以删除约束TValue
并使用Comparer
,或者具有允许将比较指定为另一个参数的重载.
public static TSource MaxBy(this IEnumerable source, Func selector) where TValue : IComparable { TValue maxValue = default(TValue); TSource maxElement = default(TSource); bool gotAny = false; foreach (TSource sourceValue in source) { TValue value = selector(sourceValue); if (!gotAny || value.CompareTo(maxValue) > 0) { maxValue = value; maxElement = sourceValue; gotAny = true; } } if (!gotAny) { throw new InvalidOperationException("source is empty"); } return maxElement; }
样本使用:(注意类型推断):
string maxName = models.MaxBy(model => model.Name.Length).Name;