2008-10-30 4 views
9

berechnen ich so etwas wieKürzeste Codeliste min/max in .NET

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

möchte Gibt es eine eingebaute Möglichkeit, dies in .NET zu tun? auf diese

+4

Short Code nicht eine Metrik für mich ist. Machen Sie Ihren Code so klar und lesbar wie möglich. Du zahlst nicht pro Zeile;). – Tigraine

Antwort

18

Versuchen Sie suchen:

Min

Max

Solange Ihre Klasse implementiert IComparable, alles, was Sie tun müssen, ist:

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

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

.NET 3.5 Ich denke. Ich bin immer noch in 2, habe nicht einmal realisiert, dass es diese gibt. – ripper234

+2

Wenn Sie noch in .NET 2.0 sind, wie kann dies Ihre akzeptierte Antwort sein? –

+3

Weil es ein guter ist (ich sollte nur zu 3.5 bewegen :) – ripper234

3

Mit Linq Sie das haben Min() und Max() Funktionen.

So können Sie list.AsQueryable().Min();

+0

Minor: keine Notwendigkeit für AsQueryable() hier ... –

+0

Mir war nicht bewusst, dass die Liste <> hatte Min und Max Funktionen. Du lernst hier jeden Tag etwas Neues! :-) –

2

tun Sie beachten Sie, dass "Ich bin immer noch in 2" - Sie könnten, dann möchten, auf LINQBridge suchen. Dies wird tatsächlich dem Ziel, C# 3.0 und .NET 2.0, aber Sie sollten es nutzen können mit C# 2.0 und .NET 2.0 - nur werden Sie die lange Hand benutzen müssen:

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

Natürlich Es wird einfacher, wenn Sie zu C# 3.0 wechseln können (immer noch mit .NET 2.0).

Und wenn LINQBridge keine Option ist, können Sie es selbst implementieren:

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; 
} 
+0

Ich habe es implementiert - ich glaube, mein Code ist genau wie Ihr Schnipsel. Hast du es von meiner Quellcodeverwaltung genommen? :) – ripper234

10

Nun, wenn Sie nicht .NET 3.5 verwenden können, können Sie immer die Liste sortieren und dann Liste zurückkehren [0 ]. Es ist vielleicht nicht der schnellste Weg, aber es ist wahrscheinlich der kürzeste Code, besonders wenn Ihre Klasse IComparable bereits implementiert.

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 

Dies setzt auch voraus, natürlich, dass es keine Rolle spielt, welches Element Sie zurück, wenn Sie mehrere Elemente, die das Minimum oder Maximum sind.

Wenn Ihre Klasse nicht IComparable implementieren, können Sie in einem anonymen Delegaten übergeben, so etwas wie dieses:

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

ich stimme zu, ich mag es ... vor allem angesichts der Tatsache, dass er in 2.0 ist. Upvoted! – Ken

Verwandte Themen