2008-10-30 40 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); });