Tôi có Danh sách List<MyType>
, loại của tôi chứa Age
và RandomID
Nhận giá trị Max từ Danh sách <myType>
Bây giờ tôi muốn tìm ra tuổi tối đa khỏi danh sách này.
Cách đơn giản và hiệu quả nhất là gì?
Tôi có Danh sách List<MyType>
, loại của tôi chứa Age
và RandomID
Nhận giá trị Max từ Danh sách <myType>
Bây giờ tôi muốn tìm ra tuổi tối đa khỏi danh sách này.
Cách đơn giản và hiệu quả nhất là gì?
Được rồi, vì vậy nếu bạn không có LINQ, bạn có thể mã hóa cứng nó:
public int FindMaxAge(List<MyType> list)
{
if (list.Count == 0)
{
throw new InvalidOperationException("Empty list");
}
int maxAge = int.MinValue;
foreach (MyType type in list)
{
if (type.Age > maxAge)
{
maxAge = type.Age;
}
}
return maxAge;
}
Hoặc bạn có thể viết một phiên bản tổng quát hơn, tái sử dụng trên nhiều loại danh sách:
public int FindMaxValue<T>(List<T> list, Converter<T, int> projection)
{
if (list.Count == 0)
{
throw new InvalidOperationException("Empty list");
}
int maxValue = int.MinValue;
foreach (T item in list)
{
int value = projection(item);
if (value > maxValue)
{
maxValue = value;
}
}
return maxValue;
}
Bạn có thể sử dụng này với:
// C# 2
int maxAge = FindMax(list, delegate(MyType x) { return x.Age; });
// C# 3
int maxAge = FindMax(list, x => x.Age);
Hoặc bạn có thể sử dụng LINQBridge :)
Trong mỗi trường hợp, bạn có thể trả lại khối nếu có một cuộc gọi đơn giản đến Math.Max
nếu bạn muốn. Ví dụ:
foreach (T item in list)
{
maxValue = Math.Max(maxValue, projection(item));
}
Giả sử bạn có quyền truy cập vào LINQ, và Age
là một int
(bạn cũng có thể thử var maxAge
- đó là nhiều khả năng biên dịch):
int maxAge = myTypes.Max(t => t.Age);
Nếu bạn cũng cần RandomID
(hoặc toàn bộ đối tượng) , một giải pháp nhanh chóng là sử dụng MaxBy
từ MoreLinq
MyType oldest = myTypes.MaxBy(t => t.Age);
thelist.Max(e => e.age);
int max = myList.Max(r => r.Age);
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.max.aspx
Nói rõ ràng nhưng ... Để sử dụng trong .net 4.0 và VS2010 bạn cần "using System.Linq;". Nhấp chuột phải vào lỗi không cung cấp tùy chọn "Giải quyết". – Soenhay
Làm thế nào về cách này:
List<int> myList = new List<int>(){1, 2, 3, 4}; //or any other type
myList.Sort();
int greatestValue = myList[ myList.Count - 1 ];
Bạn về cơ bản cho phép các Sort()
phương pháp để làm công việc cho bạn thay vì viết phương pháp riêng của mình. Trừ khi bạn không muốn sắp xếp bộ sưu tập của mình.
Loại đại biểu bạn có thể vui lòng cho ví dụ – Shrivallabh
@Shrivallabh: Tôi không biết ý bạn là gì, tôi sợ. –
@ JonSkeet, tôi nghĩ rằng anh ấy cần một số công cụ xây dựng cho ví dụ 'delegate'. Tôi cũng không thể hiểu được điều đó, đó là lý do tại sao tôi phải đi với phương pháp thứ 2 mà bạn đã sử dụng trong cùng một khối. Điều FindMax. –