C# 从列表中返回具有最小值的项
我有一个项目清单:C# 从列表中返回具有最小值的项,c#,list,min,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)); 您可以先获取最小值,然后获取具有最小值的项: var minValue = items.Min(x => x.Value); var item = items.First(x =>
List<Item> items = new List<Item>();
items.add(new Item("cow", 4));
items.add(new Item("pig", 7));
items.add(new Item("dog", 12));
您可以先获取最小值,然后获取具有最小值的项:
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));
您可以先获取最小值,然后获取具有最小值的项:
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));
您可以按值对项目进行排序,然后使用First选择最低的:
Item lowestValueItem = items
.OrderBy(i => i.Value)
.First();
当然,还有一种更有效的方法。您可以按值对项目进行排序,然后使用First取最低值:
Item lowestValueItem = items
.OrderBy(i => i.Value)
.First();
当然,还有一种更有效的方法。我有一个实用的方法来做这件事,它非常有效,而且可以重复使用! 它只在集合上迭代一次
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;
}
为了通用,该方法需要实现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);
}
}
我有一个实用的方法来做这件事,这是相当有效和可重用的! 它只在集合上迭代一次
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;
}
为了通用,该方法需要实现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);
}
}
“选择”不是一个选项List@Evorlor为什么会这样?它说列表中并没有包含您需要使用System.Linq的ITQ的定义;将using指令添加到代码的顶部。这只会在最坏的情况下将集合迭代2N次。我建议的解决方案将重复N次。Select不是List@Evorlor为什么会这样?它说列表中并没有包含您需要使用System.Linq的ITQ的定义;将using指令添加到代码的顶部。这只会在最坏的情况下将集合迭代2N次。我建议的解决方案会重复N次。谢谢!我在寻找这一方面的效率。你知道这个答案还是塞尔曼的答案更有效吗?或者如果差别不大?@Evorlo:你可以用MoreLinq的MinBy。编辑我的答案。谢谢!我在寻找这一方面的效率。你知道这个答案还是塞尔曼的答案更有效吗?或者如果差别不大?@Evorlo:你可以用MoreLinq的MinBy。编辑了我的答案。