widzę masz odpowiedź tak, ale ...
można uniknąć tylko przez pewną brzydotę podział oświadczenie na dwie połówki:
Comparison<StatInfo> comparison = (x, y) => DateTime.Compare(x.date, y.date);
_allStatInfo.Sort(comparison);
Możesz chcieć rozważyć właśnie dzwoni CompareTo
bezpośrednio, za:
Comparison<StatInfo> comparison = (x, y) => x.date.CompareTo(y.date);
_allStatInfo.Sort(comparison);
można by utworzyć IComparer<T>
Implementacja przy użyciu mojej klasy ProjectionComparer
- jest częścią MiscUtil, a na tę odpowiedź dołączono wersję bez komentarza u dołu . Można by wtedy napisać:
_allStatInfo.Sort(ProjectionComparer<StatInfo>.Create(x => x.date));
Nawet jeśli używasz .NET 2.0, można nadal korzystać z LINQ drodze LINQBridge.
Oto klasa ProjectionComparer
wymagana dla drugiej odpowiedzi. Pierwsze dwie klasy są naprawdę tylko pomocnikami, aby pozwolić, aby ogólne wnioskowanie typu działało lepiej.
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));
}
}
Zaczekaj Jon Skeet, aby pokazać się. Jego C# in Depth: To, czego potrzebujesz do opanowania C# 2 i 3, ma dużą sekcję na ten temat. – hughdbrown
Za późno! Zawsze jestem zaskoczony, gdy jedno z moich pytań na C# nie dostało odpowiedzi od Jona Skeeta :) – marcgg
Tytuł jest błędny. mówi "tablica" –