tôi thấy bạn đã có câu trả lời nào, nhưng ...
Bạn có thể tránh được một số xấu xa bằng cách chỉ cần tách các tuyên bố thành hai nửa:
Comparison<StatInfo> comparison = (x, y) => DateTime.Compare(x.date, y.date);
_allStatInfo.Sort(comparison);
Bạn có thể muốn cũng chỉ xem xét gọi số CompareTo
trực tiếp:
Comparison<StatInfo> comparison = (x, y) => x.date.CompareTo(y.date);
_allStatInfo.Sort(comparison);
Bạn có thể tạo IComparer<T>
triển khai bằng cách sử dụng lớp học ProjectionComparer
của tôi - là một phần của MiscUtil và tôi đã bao gồm phiên bản chưa được chú giải ở cuối số câu trả lời này. Sau đó bạn muốn viết:
_allStatInfo.Sort(ProjectionComparer<StatInfo>.Create(x => x.date));
Thậm chí nếu bạn đang sử dụng .NET 2.0, bạn vẫn có thể sử dụng LINQ bằng cách LINQBridge.
Đây là yêu cầu dành cho câu trả lời thứ hai là ProjectionComparer
. Hai lớp đầu tiên thực sự chỉ là những người trợ giúp để cho phép suy luận kiểu chung tốt hơn.
public static class ProjectionComparer
{
public static ProjectionComparer<TSource, TKey> Create<TSource, TKey>
(Func<TSource, TKey> projection)
{
return new ProjectionComparer<TSource, TKey>(projection);
}
public static ProjectionComparer<TSource, TKey> Create<TSource, TKey>
(TSource ignored, Func<TSource, TKey> projection)
{
return new ProjectionComparer<TSource, TKey>(projection);
}
}
public static class ProjectionComparer<TSource>
{
public static ProjectionComparer<TSource, TKey> Create<TKey>
(Func<TSource, TKey> projection)
{
return new ProjectionComparer<TSource, TKey>(projection);
}
}
public class ProjectionComparer<TSource, TKey> : IComparer<TSource>
{
readonly Func<TSource, TKey> projection;
readonly IComparer<TKey> comparer;
public ProjectionComparer(Func<TSource, TKey> projection)
: this (projection, null)
{
}
public ProjectionComparer(Func<TSource, TKey> projection,
IComparer<TKey> comparer)
{
projection.ThrowIfNull("projection");
this.comparer = comparer ?? Comparer<TKey>.Default;
this.projection = projection;
}
public int Compare(TSource x, TSource y)
{
// Don't want to project from nullity
if (x==null && y==null)
{
return 0;
}
if (x==null)
{
return -1;
}
if (y==null)
{
return 1;
}
return comparer.Compare(projection(x), projection(y));
}
}
Nguồn
2009-08-19 19:36:24
Chờ Jon Skeet để hiển thị. C# của anh ta trong chiều sâu: Những gì bạn cần để làm chủ C# 2 và 3 có một phần lớn về điều đó. – hughdbrown
Quá muộn! Tôi luôn ngạc nhiên khi một trong những câu hỏi của tôi trên C# không nhận được câu trả lời từ Jon Skeet :) – marcgg
tiêu đề là sai. nói "mảng" –