2011-12-16 18 views
5

Tengo dos listas a las que estoy accediendo por índice (por ejemplo, Name[10], Date[10]). Están estrechamente vinculados, por lo que Name[10] está relacionado con Date[10] y viceversa.Ordene dos listas <T> juntas como una sola?

Este diseño ha funcionado bien pero ahora tengo que ordenarlos. Puedo ordenarlos individualmente, pero obviamente eso eliminaría la relación entre las dos listas y las haría inútiles.

Pensé en usar un Dictionary<string, DateTime> en su lugar, pero parece que solo puedo acceder a eso por Key (que tampoco funciona). Esencialmente necesito tres cosas, dos valores y un índice que pueda iterar numéricamente (no foreach).

¿Alguien puede ayudar? Parece que sea necesario cambiar la estructura de datos o encontrar la manera de ordenar dos distintos List<T> juntos ...

public class Results 
{ 
public List<string> Name { get; set; } 
public List<DateTime> Date{ get; set; } 
} 

for (int x = 0; x < results; x++) 
{ z.N = results.Name[X]; z.D = results.Date[x]; } 

Respuesta

9

Parece que usted está luchando en contra de hacer la solución obvia que implica un poco poco de trabajo inicial: crear un tipo para encapsular el par nombre/fecha.

Eso es absolutamente lo que debe hacer. Luego puede tener una lista, ordenarla por nombre o por fecha o lo que desee, y nunca tendrá que preocuparse de que las dos listas se desincronicen, etc.

Si su clase Results no hace nada aparte de contienen esas dos listas, en realidad puede terminar con el mismo número de tipos: puede abandonar Results por completo, a favor de List<Result> donde Result tiene un nombre y una fecha.

+0

él puede usar el diccionario genérico – AMH

+3

@AMH: El OP ya consideró eso - no conserva el orden, y es fundamentalmente * no * lo que está intentando almacenar. Él quiere una lista, pero de dos valores diferentes. –

+1

Como beneficio adicional, esta solución le permitirá dar un nombre explícito al concepto que esté tratando de representar y, además, puede incorporar lógica para manipular estos datos dentro del mismo tipo, en lugar de tenerlo esparcido por todas partes. tu código en otro lugar. –

2

Hágase un favor y mantener las dos cosas juntas:

public class NameAndDate { 
    public string Name { get; set; } 
    public DateTime Date { get; set; } 
} 

A continuación, los guarda en una lista (List<NameAndDate>):

Si desea ordenar por el nombre, añadir una aplicación IComparer a NameAndDate, entonces puede simplemente llamar al Sort() en la lista.

Si desea mantener el acceso al nombre y la fecha, añadir métodos de acceso a los resultados, al igual que

public string GetName(int index) { 
    return list[i].Name; 
} 
1

Se puede crear un tipo personalizado para mantener un valor, o si sólo hay que usarla en el alcance de un único método, puede usar un tipo anónimo de la siguiente manera.

var namesAndDates = MyNames 
    .Select((name, i) => new {name, date = MyDates[i]}); 

De aquí los dos valores ya no están sueltos. Ahora puedes ordenarlos.

var sortedNamesAndDates = namesAndDates.OrderBy(a => a.date); 

O lo que sea que tengas que hacer con ellos.

0

podrá usar el diccionario con el nombre de clave y valor Fecha

y U puede después de ese tipo fácilmente

2
List<Tuple<string,DateTime> NameDateList {get; set; } 

es una manera fácil de lograr lo que desea, pero para mayor claridad que son probablemente mejor hacer un tipo personalizado para alojarlos, tales como:

public class NameDate 
{ 
    public string Name { get; set; } 
    public DateTime Date{ get; set; } 
} 

Posteriormente, se podría utilizar:

List<NameDate> NameDateList {get; set; } 
1

Crear una clase llamada "Resultado" con dos propiedades

public class Result 
{ 
    public string Name {set;get;} 
    public DateTime Date { set;get;} 
} 

Ahora usted puede crear una lista de esta clase

List<Result> objListResult=new List<Result>(); 

En su caso, si lo desea, puede leer el contenido de su lista indidual y ponerlo en nuestra nueva lista. (Esto solo es importante para su caso, si realmente desea mover los datos de sus Listas anteriores a nuestra nueva Lista. Si es posible, puede actualizar el código donde carga los datos a dos Listas (esa es la forma correcta) para que lo haga cargar datos a nuestra nueva lista de Tipo de resultado y evitar el código de portabilidad para mover datos a la nueva lista.

for(int i=0;i<Name.Count;i++) 
{ 
    objListResult.Add(new Result { Name =Name[i].ToString(), Date[i].ToString() }); 
} 

se puede acceder a los artículos de la nueva lista como esta

objListResult[2].Date 

le dará la Fecha almacenada para el segundo objeto en la lista

objListResult[2].Name 

le dará el nombre almacenado para el segundo objeto en la lista

+0

¿Cómo no se ha subido de categoría este oro ni siquiera una vez? –

6

uso de la sobrecarga Array.Sort que tiene una matriz de claves y una matriz de valores, no exactamente lo que quiere. (Este método ha estado disponible desde .NET 2.0.)

+2

Gracias por responder la pregunta tal como se indicó. Emparejar el nombre y la fecha juntos como las otras respuestas sugieren generalmente buenos consejos, pero hay situaciones en las que tiene sentido almacenar dos matrices simétricas. Específicamente, utilizando un diseño de datos de "estructura de matrices" en un algoritmo computacionalmente intensivo. –

+1

Perfecto. Exactamente lo que estaba buscando. No sabía que esta característica existía. – Timo

Cuestiones relacionadas