Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从列表中返回具有最小值的项_C#_List_Min - Fatal编程技术网

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。编辑了我的答案。