通常,要找到具有最大值属性的元素,我喜欢这样

var itemWithMaxPropValue = collection.OrderByDescending(x => x.Property).First();

但从性能的角度来看,这是一种好方法吗?也许我应该做这样的事情?
var maxValOfProperty = collection.Max(x => x.Property);
var itemWithMaxPropValue = collection
                                 .Where(x => x.Property == maxValueOfProperty).First();

最佳答案

这两种解决方案都不是很有效。第一个解决方案涉及对整个集合进行排序。第二种解决方案需要遍历集合两次。但是您可以一次找到具有最大属性值的项目,而无需对集合进行排序。 MoreLINQ 库中有 MaxBy 扩展。或者您可以实现相同的功能:

public static TSource MaxBy<TSource, TProperty>(this IEnumerable<TSource> source,
    Func<TSource, TProperty> selector)
{
    // check args

    using (var iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
            throw new InvalidOperationException();

        var max = iterator.Current;
        var maxValue = selector(max);
        var comparer = Comparer<TProperty>.Default;

        while (iterator.MoveNext())
        {
            var current = iterator.Current;
            var currentValue = selector(current);

            if (comparer.Compare(currentValue, maxValue) > 0)
            {
                max = current;
                maxValue = currentValue;
            }
        }

        return max;
    }
}

用法很简单:
var itemWithMaxPropValue = collection.MaxBy(x => x.Property);

关于c# - 查找具有最大值属性的元素更快,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35461643/

10-08 23:44