我是 .net 3.5 的新手。 我有一个项目集合:
IList<Model> models;
在哪里
class Model
{
public string Name
{
get;
private set;
}
}
我想获取名称长度最长的元素。 我试过了
string maxItem = models.Max<Model>(model => model.Name.Length);
但它当然会返回最大长度(我需要一个 Model
对象)。我知道有一种使用扩展方法可以做到这一点的方法,但我不知道怎么做。
最佳答案
不幸的是,没有内置的方法来执行此操作 - 但编写扩展方法来执行此操作真的很容易。
它在 one of my very first blog posts 中,事实上......请注意其中一条评论中有更好的实现。如果我有时间,我会把它移入体内。
编辑:好的,我有一个稍微简化的版本——它只返回最大元素,使用给定的选择器。也不需要做投影——如果需要的话,之后再做一次。请注意,您可以删除 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;
}
示例使用:(笔记类型推断):
string maxName = models.MaxBy(model => model.Name.Length).Name;
关于c# - 根据某种标准从集合中选择最大的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384633/