agn*_*zka 2 c# extension-methods .net-3.5
我是.net 3.5的新手.我有一个项目集合:
IList<Model> models;
Run Code Online (Sandbox Code Playgroud)
哪里
class Model
{
public string Name
{
get;
private set;
}
}
Run Code Online (Sandbox Code Playgroud)
我想得到名称长度最长的元素.我试过了
string maxItem = models.Max<Model>(model => model.Name.Length);
Run Code Online (Sandbox Code Playgroud)
但它当然会返回最大长度(我需要一个Model对象).我知道有一种方法可以使用扩展方法,但我不知道如何.
遗憾的是,没有内置的方法可以做到这一点 - 但是编写扩展方法很容易.
事实上,这是我的第一篇博客文章之一......请注意,其中一条评论中有更好的实施方式.如果我有时间,我会把它移到身体里.
编辑:好的,我有一个略有缩写的版本 - 它只返回最大元素,使用给定的选择器.也不需要进行投影 - 如果需要,可以在之后做一次.请注意,您可以删除约束TValue并使用Comparer<TValue>.Default,或者具有允许将比较指定为另一个参数的重载.
public static TSource MaxBy<TSource, TValue>(this IEnumerable<TSource> source,
Func<TSource, TValue> selector)
where TValue : IComparable<TValue>
{
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;
}
Run Code Online (Sandbox Code Playgroud)
样本使用:(注意类型推断):
string maxName = models.MaxBy(model => model.Name.Length).Name;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |