【问题标题】:Return Item from List with Minimum Value从列表中返回具有最小值的项目
【发布时间】:2023-04-11 12:13:01
【问题描述】:

我有一个物品清单:

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);

【问题讨论】:

    标签: c# list min


    【解决方案1】:

    可以先取最小值,再取最小值的item:

    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));
    

    【讨论】:

    • 选择不是列表的选项
    • @Evorlor 为什么会这样?
    • 它说 List 不包含它的定义
    • 你需要 using System.Linq; 在你的代码顶部添加 using 指令。
    • 这只是将您的集合迭代 2N 次(最坏情况)。我建议的解决方案将迭代一次(N 次)。
    【解决方案2】:

    您可以通过Value订购商品,然后使用First取最低:

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

    另一种(更有效的)方式,MinBy of morelinq

    【讨论】:

    • 谢谢!我正在寻找这个效率。你知道这个答案还是塞尔曼的答案更有效吗?或者如果差异微不足道?
    • @Evorlor:你可以使用 MoreLinq 的 MinBy。编辑了我的答案。
    【解决方案3】:

    我有一个实用的方法来做这件事,它非常有效且可重复使用! 它只对集合进行一次迭代(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);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多