2015-05-04 12 views
5

Ho 3 Lista contenente: Index, nome, etàOrdinamento Liste multiple

Esempio:

List<int> indexList = new List<int>(); 
indexList.Add(3); 
indexList.Add(1); 
indexList.Add(2); 
List<string> nameList = new List<string>(); 
nameList.Add("John"); 
nameList.Add("Mary"); 
nameList.Add("Jane"); 
List<int> ageList = new List<int>(); 
ageList.Add(16); 
ageList.Add(17); 
ageList.Add(18); 

ora devo ordinare tutti e 3 l'elenco in base alla indexList.

Come si usa .Sort() per indexList mentre l'ordinamento gli altri 2 lista pure

+0

C'è qualche motivo per cui si hanno questi elenchi come diversi di oggetti correlati, invece di averli memorizzati in una classe con questi come proprietà? –

+3

Crea una 'classe' che contiene Nome ed Età (e" indice "se ne hai veramente bisogno), quindi ordina semplicemente insieme usando' .OrderBy'. – crashmstr

+0

Dizionario/SortedList + classe anonima? – dr4cul4

risposta

16

State guardando nel modo sbagliato. Creare una classe personalizzata:

class Person 
{ 
    public int Index { get; set; } 
    public string Name{ get; set; } 
    public int Age{ get; set; } 
} 

Poi, ordinare la List<Person> con l'aiuto del metodo OrderBy dal System.Linq namespace:

List<Person> myList = new List<Person>() { 
    new Person { Index = 1, Name = "John", Age = 16 }; 
    new Person { Index = 2, Name = "James", Age = 19 }; 
} 
... 

var ordered = myList.OrderBy(x => x.Index); 

Inoltre, è possibile leggere Jon Skeet article sulla tua anti-modello.

+5

[Come l'onnipotente Jon Skeet una volta decretato] (http://codeblog.jonskeet.uk/2014/06/03/anti-pattern-parallel-collections/) – Aron

+0

@Aron, grazie. Ho aggiornato la mia risposta con il link a quell'articolo. –

3

La risposta di Farhad è corretta e dovrebbe essere accettata. Ma se si hanno veramente a ordinare tre liste collegate in questo modo si potrebbe usare Enumerable.Zip e OrderBy:

var joined = indexList.Zip(
     nameList.Zip(ageList, (n, a) => new { Name = n, Age = a }), 
      (ix, x) => new { Index = ix, x.Age, x.Name }) 
     .OrderBy(x => x.Index); 
indexList = joined.Select(x => x.Index).ToList(); 
nameList = joined.Select(x => x.Name).ToList(); 
ageList = joined.Select(x => x.Age).ToList(); 

Tutti sono ordinate in base al valore dell'indice-list in seguito.