用于计算.NET中列表最小值/最大值的最短代码

时间:2008-10-30 15:17:08

标签: c# .net algorithm

我想要像

这样的东西
int minIndex = list.FindMin(delegate (MyClass a, MyClass b) {returns a.CompareTo(b);});

在.NET中有没有内置的方法呢?

4 个答案:

答案 0 :(得分:19)

试着看看这些:

Min

Max

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

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

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

答案 1 :(得分:10)

好吧,如果你不能使用.NET 3.5,你总是可以对列表进行排序,然后返回列表[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 :(得分:3)

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

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

答案 3 :(得分:2)

你注意到“我还在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;
}