c# - orderby - ordenar arraylist java
¿Cómo ordenar una lista de objetos por un campo específico en C#? (6)
Tengo esta clase
public class StatInfo
{
public string contact;
public DateTime date;
public string action;
}
luego tengo una lista de StatInfo, pero no estoy seguro de cómo ordenarla de acuerdo con el campo de fecha. ¿Debo usar el método de clasificación? ¿Debo crear mi propia?
var _allStatInfo = new List<StatInfo>();
// adding lots of stuff in it
_allStatInfo.SortByDate???
¿Cuál es la mejor manera de hacerlo sin tener que escribir toneladas de código (si es posible)?
Gracias
Para ilustrar la respuesta de Robert C. Cartaino:
public class StatInfo : IComparable<StatInfo>
{
public string contact;
public DateTime date;
public string action;
public int CompareTo(StatInfo value)
{
return this.date.CompareTo(value.date);
}
}
var _allStatInfo = new List<StatInfo>();
// this now sorts by date
_allStatInfo.Sort();
No es la solución más general pero es buena si solo va a ordenar por fecha. Y, como dijo Robert, aún puede anular la ordenación predeterminada pasando un parámetro IComparer al método de ordenación.
Para un DateTime no debería ser necesario comparar.
_allStatInfo.OrderyBy(d => d.date);
o
_allStatInfo.OrderByDescending(d => d.Date);
Use una expresión lambda para asignar un par a una comparación:
_allStatInfo.Sort((x, y) => x.date - y.date);
Utilizando LINQ:
var sortedList = _allStatInfo.OrderBy(si => si.date).ToList();
Ordenando la lista original:
_allStatInfo.Sort(new Comparison<StatInfo>((x, y) => DateTime.Compare(x.date, y.date)));
Veo que tienes la respuesta de todos modos, pero ...
Puedes evitar algo de fealdad simplemente dividiendo 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 simplemente llamar a
CompareTo
directamente, también:Comparison<StatInfo> comparison = (x, y) => x.date.CompareTo(y.date); _allStatInfo.Sort(comparison);
Podría crear una
IComparer<T>
usando mi claseProjectionComparer
; es parte de MiscUtil , y he incluido una versión sin comentarios al final de esta respuesta. Luego escribirías:_allStatInfo.Sort(ProjectionComparer<StatInfo>.Create(x => x.date));
Incluso si está utilizando .NET 2.0, puede usar LINQ a través de LINQBridge .
Aquí está la clase ProjectionComparer
requerida para la segunda respuesta. Las primeras dos clases son en realidad solo ayudantes para que la inferencia de tipos genéricos 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));
}
}
funcionó para mí ُ Ordenando una matriz de tipo personalizado usando delegado
// sort array by name
Array.Sort(users, delegate(User user1, User user2)
{
return user1.Name.CompareTo(user2.Name);
});
// write array (output: Betty23 Lisa25 Susan20)
foreach (User user in users) Console.Write(user.Name + user.Age + " ");