veo que tienes la respuesta de todos modos, pero ...
puede eliminar causas de la fealdad sólo por la división de la declaración en dos mitades:
Comparison<StatInfo> comparison = (x, y) => DateTime.Compare(x.date, y.date);
_allStatInfo.Sort(comparison);
Es posible que desee considerar sólo llamar directamente CompareTo
, también:
Comparison<StatInfo> comparison = (x, y) => x.date.CompareTo(y.date);
_allStatInfo.Sort(comparison);
puede crear un IComparer<T>
implementación usando mi clase ProjectionComparer
- es parte de MiscUtil, y he incluido una versión sin comentar en la parte inferior de esta respuesta. A continuación, escribiría:
_allStatInfo.Sort(ProjectionComparer<StatInfo>.Create(x => x.date));
Incluso si usted está utilizando .NET 2.0, todavía se puede utilizar LINQ a través de LINQBridge.
Aquí está la clase ProjectionComparer
requerida para la segunda respuesta. Las primeras dos clases son realmente solo ayudantes para que la inferencia de tipo genérico funcione mejor.
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));
}
}
Espere a que Jon Skeet en aparecer. Su C# en profundidad: lo que necesita para dominar C# 2 y 3 tiene una gran sección sobre eso. – hughdbrown
¡Demasiado tarde! Siempre me sorprende cuando una de mis preguntas sobre C# no obtiene una respuesta de Jon Skeet :) – marcgg
título es incorrecto. dice "matriz" –