2008-10-30 12 views

Odpowiedz

18

spróbuj poszukać w tych:

Min

Max

Dopóki klasa implementuje IComparable, wszystko co musisz zrobić, to:

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

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

.NET 3.5 Chyba. Nadal jestem w 2, nawet nie zdawałem sobie sprawy, że one istnieją. – ripper234

+2

Jeśli nadal jesteś w .NET 2.0, jak to może być twoja zaakceptowana odpowiedź? –

+3

Ponieważ jest to dobry (powinienem po prostu przenieść się do 3.5 :) – ripper234

3

użyciu LINQ masz Funkcje Min() i Max().

Więc można zrobić list.AsQueryable().Min();

+0

Niewielkie: nie ma potrzeby AsQueryable() tutaj ... –

+0

Nie wiedziałem, że lista <> ma funkcje Min i Max. Każdego dnia uczysz się czegoś nowego! :-) –

2

pamiętać, że „nadal jestem w 2” - Państwo może więc warto spojrzeć na LINQBridge. To jest rzeczywiście na celu C# 3.0 i .NET 2.0, ale powinieneś być w stanie go używać z C# 2.0 i .NET 2.0 - po prostu będziesz musiał użyć długiej ręki:

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

oczywiście będzie łatwiej, jeśli przełączysz się na C# 3.0 (nadal celując w .NET 2.0).

A jeśli LINQBridge nie jest opcją, można go realizować siebie:

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

Skończyło się na implementacji - uważam, że mój kod jest DOKŁADNIE podobny do twojego fragmentu. Czy wziąłeś to z mojej kontroli źródła? :) – ripper234

10

Cóż, jeśli nie można użyć .NET 3.5, zawsze można posortować listę, a następnie powrócić listy [0 ]. Może nie jest to najszybszy sposób, ale prawdopodobnie jest to najkrótszy kod, szczególnie jeśli twoja klasa już implementuje 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 

ta zakłada także, oczywiście, że to nie ma znaczenia, który element wrócisz, jeśli masz wiele przedmiotów, które są minimalne lub maksymalne.

Jeśli klasa nie implementuje IComparable, można przekazać w anonimowej delegata, coś takiego:

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

Zgadzam się, podoba mi się ... szczególnie biorąc pod uwagę fakt, że jest w 2.0. Rewizja! – Ken

Powiązane problemy