【问题标题】:Shortest code to calculate list min/max in .NET在 .NET 中计算列表最小值/最大值的最短代码
【发布时间】:2023-04-07 03:11:01
【问题描述】:

我想要类似的东西

int minIndex = list.FindMin(delegate (MyClass a, MyClass b) {returns a.CompareTo(b);});

.NET 中是否有内置方法可以做到这一点?

【问题讨论】:

  • 短代码对我来说不是衡量标准。使您的代码尽可能清晰易读。您无需按行付费;)。

标签: c# .net algorithm


【解决方案1】:

试试看这些:

Min

Max

只要你的类实现了 IComparable,你所要做的就是:

List<MyClass> list = new List();
//add whatever you need to add

MyClass min = list.Min();
MyClass max = list.Max();

【讨论】:

  • .NET 3.5 我猜。我还在 2 中,甚至没有意识到这些存在。
  • 如果您仍在使用 .NET 2.0,这怎么可能是您接受的答案?
【解决方案2】:

好吧,如果你不能使用 .NET 3.5,你总是可以对列表进行排序,然后返回 list[0]。这可能不是最快的方法,但可能是最短的代码,尤其是如果您的类已经实现了 IComparable。

List<SomeClass> list = new List<SomeClass>();
// populate the list
// assume that SomeClass implements IComparable
list.Sort();
return list[0];               // min, or
return list[list.Count - 1];  // max

当然,这还假设,如果您有多个最小或最大的项目,则返回哪个项目并不重要。

如果你的类没有实现 IComparable,你可以传入一个匿名委托,如下所示:

list.Sort(delegate(SomeClass x, SomeClass y) { return string.Compare(x.Name, y.Name); });

【讨论】:

  • 我同意,我喜欢它...尤其是考虑到他在 2.0 中。点赞!
【解决方案3】:

使用 Linq 你有 Min() 和 Max() 函数。

所以你可以list.AsQueryable().Min();

【讨论】:

  • 我不知道 List 有 Min 和 Max 函数。你每天都在这里学到新东西! :-)
【解决方案4】:

您注意到“我仍在 2 中”——那么您可能想查看 LINQBridge。这实际上是针对 C# 3.0 和 .NET 2.0,但您应该能够将它与 C# 2.0 和 .NET 2.0 一起使用 - 只是您必须使用长手:

MyClass min = Enumerable.Min(list),
        max = Enumerable.Max(list);

当然,如果您可以切换到 C# 3.0(仍然针对 .NET 2.0)会更容易。

如果 LINQBridge 不是一个选项,您可以自己实现它:

static void Main()
{
    int[] data = { 3, 5, 1, 5, 5 };
    int min = Min(data);
}
static T Min<T>(IEnumerable<T> values)
{
    return Min<T>(values, Comparer<T>.Default);
}
static T Min<T>(IEnumerable<T> values, IComparer<T> comparer)
{
    bool first = true;
    T result = default(T);
    foreach(T value in values) {
        if(first)
        {
            result = value;
            first = false;
        }
        else
        {
            if(comparer.Compare(result, value) > 0) 
            {
                result = value;
            }
        }
    }
    return result;
}

【讨论】:

  • 我最终实现了它——我相信我的代码和你的 sn-p 完全一样。你是从我的源代码管理中获取的吗? :)
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 2014-09-27
  • 2016-06-03
  • 1970-01-01
  • 2020-12-23
  • 2016-11-04
  • 2015-10-29
  • 1970-01-01
相关资源
最近更新 更多