2008-10-30 75 views
9

我想是这样最短代码来计算列表最小/最大的.NET

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

有一个内置的方式在.NET中做到这一点?

+4

短代码是不是我的度量。 尽可能使您的代码清晰可读。你不支付每行;)。 – Tigraine 2008-10-30 21:28:34

回答

18

尝试寻找这些:

Min

Max

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

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

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

.NET 3.5我猜。我仍然在2,甚至没有意识到这些存在。 – ripper234 2008-10-30 15:27:37

+2

如果你还在.NET 2.0中,这怎么可能成为你接受的答案? – 2008-10-30 21:27:47

+3

因为它是一个很好的(我应该移动到3.5 :) – ripper234 2008-12-30 10:58:01

3

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

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

+0

轻微:在这里不需要AsQueryable()... – 2008-10-30 21:13:21

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