我有一个项目清单:
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);
答案 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();
答案 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);
}
}