2008-10-30 11 views
9

NET'te liste min/maks hesaplamak için en kısa kod

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

gibi bir şey isterim Bunu .NET'te yapmanın bir yolu var mı?

+4

Kısa kod benim için metrik değildir. Kodunuzu mümkün olduğunca açık ve okunabilir yapın. Satır başına ödeme yapmazsınız;). – Tigraine

cevap

18

bunlara bakarak deneyin: Sürece sınıf IComparable uygulayan olarak

Min

Max

, yapmanız gereken tek şey: Linq kullanarak

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

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

.NET 3.5 Sanırım. Hala 2 yaşındayım, bunların var olduğunu bile bilmiyordum. – ripper234

+2

Eğer hala .NET 2.0'deseniz, bu sizin kabul ettiğiniz yanıtınız olabilir mi? –

+3

Çünkü iyi bir tane (3.5'e taşınmalıyım :) – ripper234

3

var Min() ve Max() işlevleri. Eğer, o zaman, LINQBridge bakmak isteyebilirsiniz -

Yani "Ben 2'de hala değilim" olduğunu not almanız list.AsQueryable().Min();

+0

Minör: AsQueryable() 'a gerek yok ... –

+0

List <> Min ve Max fonksiyonlarının olduğunu bilmiyordum. Her gün yeni bir şeyler öğreniyorsun! :-) –

2

yapabilirsiniz. Bu aslında C# 3.0 ve .NET 2.0 hedefleniyor, ancak bunu kullanmak gerekir C# 2.0 ve .NET 2.0 - Sadece uzun elden kullanmak gerekecektir: Elbette

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

, C# 3.0'a geçebilirsiniz (hala .NET 2.0'ı hedefliyor). .NET 3.5 kullanamıyorsanız

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

Uygulamayı bitirdim - Kodumun snippet'iniz gibi TAMAM olduğunu düşünüyorum. Kaynak kontrolümden mi aldın? :) – ripper234

10

Eh, her zaman [0 listesini döndürür ardından listeyi sıralamak ve olabilir:

Ve LINQBridge bir seçenek değilse, bunu kendiniz uygulayabilir

]. En hızlı yol olmayabilir, ancak muhtemelen en kısa kod, özellikle de sınıfınız IComparable'ı uyguluyorsa.

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 

Bu aynı zamanda minimum veya maksimum olan birden çok öğe varsa iade hangi madde önemli olmadığını, tabii ki, varsayar. Sınıf IComparable uygulamak etmezse

, böyle, anonim bir temsilci şey geçirebilirsiniz:

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

Kabul ediyorum, özellikle beğendim ... özellikle de 2.0. Upvoted! – Ken

İlgili konular