c# - 根据某种标准从集合中选择最大的项目

标签 c# .net-3.5 extension-methods

我是 .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/

相关文章:

c# - 关于锁定策略的问题(C#/.NET 3.5 SP1)

c# - 获得一个无参数的方法来像 Func<Return>

C# 扩展方法重载

c# - 使用扩展方法访问字段的属性

c# - 是否有类似于 Twitter Bootstrap/Foundation5 的实用程序用于 Visual Studio 中的 WPF 文件?

c# - 监视套接字是否有新数据然后处理该数据的最佳方法是什么?

c# - 将动态变量转换为给定类型

linq - Entity Framework 3.5 - 如何加载子项

c# - 关于泛型和继承(原谅我不好的标题)

c# - 您如何在 C# 中模拟文件系统以进行单元测试?