Je vois que vous avez la réponse de toute façon, mais ...
Vous pouvez éviter une laideur en divisant simplement la déclaration en deux moitiés:
Comparison<StatInfo> comparison = (x, y) => DateTime.Compare(x.date, y.date);
_allStatInfo.Sort(comparison);
Vous pouvez considérer simplement appeler CompareTo
directement aussi:
Comparison<StatInfo> comparison = (x, y) => x.date.CompareTo(y.date);
_allStatInfo.Sort(comparison);
Vous pouvez créer un IComparer<T>
mise en œuvre en utilisant ma ProjectionComparer
classe - il fait partie de MiscUtil, et je l'ai inclus une version décommentée au bas de cette réponse. Vous auriez alors écrire:
_allStatInfo.Sort(ProjectionComparer<StatInfo>.Create(x => x.date));
Même si vous utilisez .NET 2.0, vous pouvez toujours utiliser LINQ par voie de LINQBridge.
est ici la classe ProjectionComparer
requise pour la deuxième réponse. Les premières classes ne sont vraiment que des aides pour que l'inférence de type générique fonctionne mieux.
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));
}
}
Attendez que Jon Skeet apparaisse. Son C# en profondeur: Ce que vous avez besoin de maîtriser C# 2 et 3 a une grande section sur cela. – hughdbrown
Trop tard! Je suis toujours surpris quand une de mes questions sur C# n'obtient pas de réponse de Jon Skeet :) – marcgg
le titre est faux. dit "array" –