按某种标准从集合中选择最大项目

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对象).我知道有一种方法可以使用扩展方法,但我不知道如何.

Jon*_*eet 7

遗憾的是,没有内置的方法可以做到这一点 - 但是编写扩展方法很容易.

事实上,这是我的第一篇博客文章之一......请注意,其中一条评论中有更好的实施方式.如果我有时间,我会把它移到身体里.

编辑:好的,我有一个略有缩写的版本 - 它只返回最大元素,使用给定的选择器.也不需要进行投影 - 如果需要,可以在之后做一次.请注意,您可以删除约束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)