2008-10-30 17 views
9

Tôi muốn một cái gì đó giống nhưmã ngắn nhất để tính toán danh sách min/max trong .NET

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

Có cách nào được xây dựng trong để làm điều này trong NET?

+4

mã ngắn không phải là một thước đo cho tôi. Làm cho mã của bạn rõ ràng và dễ đọc nhất có thể. Bạn không phải trả cho mỗi dòng;). – Tigraine

Trả lời

18

Cố gắng nhìn vào những:

Min

Max

Chừng nào lớp học của bạn thực hiện IComparable, tất cả các bạn phải làm là:

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

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

.NET 3.5 Tôi đoán vậy. Tôi vẫn còn trong 2, thậm chí không nhận ra những tồn tại. – ripper234

+2

Nếu bạn vẫn còn trong .NET 2.0, làm thế nào điều này có thể là câu trả lời được chấp nhận của bạn? –

+3

Bởi vì nó là tốt nhất (tôi chỉ nên di chuyển đến 3,5 :) – ripper234

3

Sử dụng LINQ bạn có Các hàm Min() và Max().

Vì vậy, bạn có thể làm list.AsQueryable().Min();

+0

Nhỏ: không cần cho AsQueryable() ở đây ... –

+0

Tôi không biết rằng Danh sách <> có các hàm Min và Max. Bạn học một cái gì đó mới mỗi ngày ở đây! :-) –

2

Bạn lưu ý rằng "Tôi vẫn còn trong 2" - bạn có thể, sau đó, muốn nhìn vào LINQBridge. Điều này thực sự nhắm đến C# 3.0 và .NET 2.0, nhưng bạn sẽ có thể sử dụng nó với C# 2.0 và .NET 2.0 - chỉ cần bạn sẽ sử dụng nó lâu dài:

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

Tất nhiên, nó sẽ dễ dàng hơn nếu bạn có thể chuyển sang C# 3.0 (vẫn đang nhắm mục tiêu .NET 2.0).

Và nếu LINQBridge không phải là một lựa chọn, bạn có thể thực hiện nó cho mình:

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

Tôi đã kết thúc việc triển khai nó - tôi tin rằng mã của tôi là CHÍNH XÁC như đoạn mã của bạn. Bạn đã lấy nó từ kiểm soát nguồn của tôi? :) – ripper234

10

Vâng, nếu bạn không thể sử dụng .NET 3.5, bạn có thể luôn luôn sắp xếp danh sách và sau đó trở về danh sách [0 ]. Nó có thể không phải là cách nhanh nhất, nhưng nó có thể là mã ngắn nhất, đặc biệt là nếu lớp của bạn đã triển khai 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 

Điều này cũng giả định rằng bạn không trả lại mặt hàng nào nếu bạn có nhiều mục tối thiểu hoặc tối đa.

Nếu lớp học của bạn không thực hiện IComparable, bạn có thể vượt qua trong một đại biểu vô danh, một cái gì đó như thế này:

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

tôi đồng ý, tôi thích nó ... đặc biệt là cho thực tế anh ấy là trong 2.0. Đã bỏ phiếu! – Ken

Các vấn đề liên quan