从具有最小值的列表中返回项目

时间:2014-04-26 23:19:19

标签: c# list min

我有一个项目清单:

List<Item> items = new List<Item>();
items.add(new Item("cow", 4));
items.add(new Item("pig", 7));
items.add(new Item("dog", 12));

我想要使用最小Value(数字为Value)来检索项目。我该怎么做?

我正在努力避免讨厌的foreach循环。我正在寻找以下内容:

return items.Min(Value);

3 个答案:

答案 0 :(得分:3)

您可以先获取最小值,然后获取具有最小值的项目:

var minValue = items.Min(x => x.Value);
var item = items.First(x => x.Value == minValue);

您也可以在一行中执行此操作,但效率不高,因为它会为每个项目执行Min

var item = items.First(x => x.Value == items.Min(x => x.Value));

答案 1 :(得分:2)

您可以按Value订购商品,然后使用First获取最低价:

Item lowestValueItem = items
    .OrderBy(i => i.Value)
    .First();

MinBy的另一种(更高效)方式morelinq

答案 2 :(得分:0)

我有一个实用方法来做到这一点非常有效且可重复使用! 它只迭代一次收集(n复杂性)。

public static TItem GetMinItem<TItem>(this IEnumerable<TItem> items) where TItem : IComparable<TItem>
{
    TItem minItem = default(TItem);
     bool isFirstItem = true;
        foreach (var item in items)
        {
            if (isFirstItem)
            {
                minItem = item;
                isFirstItem = false;
            }
        else
        {
            if (item.CompareTo(minItem) < 0)
            {
                minItem = item;
            }
        }
    }
    return minItem;
}

为了通用,该方法需要TItem实现IComparable。在您的情况下,您的Item类可以实现如下:

public class Item : IComparable<Item>
    {
        public string Name { get; set; }
        public double Value { get; set; }

        public int CompareTo(Item other)
        {
            return this.Value.CompareTo(other.Value);
        }
    }