Vedo che hai la risposta in ogni caso, ma ...
È possibile evitare alcune brutture semplicemente dividendo la dichiarazione in due parti:
Comparison<StatInfo> comparison = (x, y) => DateTime.Compare(x.date, y.date);
_allStatInfo.Sort(comparison);
Si potrebbe desiderare di prendere in considerazione solo chiamando CompareTo
direttamente anche:
Comparison<StatInfo> comparison = (x, y) => x.date.CompareTo(y.date);
_allStatInfo.Sort(comparison);
è possibile creare unImplementazioneutilizzando la mia classe ProjectionComparer
- fa parte di MiscUtil e ho incluso una versione senza commento nella parte inferiore di questa risposta. Farebbe quindi scrivete:
_allStatInfo.Sort(ProjectionComparer<StatInfo>.Create(x => x.date));
Anche se si sta utilizzando .NET 2.0, è comunque possibile utilizzare LINQ per mezzo di LINQBridge.
Ecco la classe ProjectionComparer
richiesta per la seconda risposta. Il primo paio di classi sono in realtà solo aiutanti per far sì che l'inferenza di tipo generico funzioni meglio.
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));
}
}
fonte
2009-08-19 19:36:24
Attendere che Jon Skeet di presentarsi. Il suo C# in profondità: Ciò di cui hai bisogno per padroneggiare C# 2 e 3 ha una grande sezione proprio su questo. – hughdbrown
Troppo tardi! Sono sempre sorpreso quando una delle mie domande su C# non riceve risposta da Jon Skeet :) – marcgg
titolo errato. dice "array" –