2011-12-16 11 views
5

Ho due elenchi a cui accedo per indice (ad esempio Name[10], Date[10]). Sono strettamente legati, quindi Name[10] è correlato a Date[10] e viceversa.Ordina due elenchi <T> insieme come uno?

Questo design ha funzionato bene, ma ora ho bisogno di ordinarli. Posso ordinarli entrambi individualmente, ma ovviamente quello rimuoverà la relazione tra le due liste e le renderà inutili.

Ho pensato di utilizzare un Dictionary<string, DateTime> invece, ma a quanto pare posso accedervi solo con Key (che è anche non gestibile). Essenzialmente ho bisogno di tre cose, due valori e un indice che posso scorrere numericamente (non foreach).

Qualcuno può aiutare? Sembra che io sia bisogno di cambiare i dati-struttura o capire come ordinare due distinti List<T> insieme ...

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]; } 

risposta

9

Sembra che si sta combattendo contro facendo la soluzione più ovvia che coinvolge un po 'dilavoro iniziale: creare un tipo per incapsulare il nome/la coppia di date.

Questo è assolutamente cosa dovresti fare. Quindi puoi avere una lista, ordinarla per nome o per data o qualsiasi altra cosa tu voglia, e non devi mai preoccuparti che le due liste non siano sincronizzate ecc.

Se la tua classe Results non fa nulla oltre a contiene queste due liste, in realtà puoi finire con lo stesso numero di tipi: puoi abbandonare interamente Results, a favore di List<Result> dove Result ha un nome e una data.

+0

può usare il dizionario generico – AMH

+3

@AMH: L'OP ha già considerato che - non conserva l'ordine, ed è fondamentalmente * non * quello che sta cercando di memorizzare. Vuole una lista, ma di due valori diversi. –

+1

Come ulteriore vantaggio, questa soluzione ti consentirà di dare un nome esplicito a qualunque concetto tu stia cercando di rappresentare, e inoltre puoi incorporare la logica per manipolare questi dati all'interno dello stesso tipo, piuttosto che averlo eventualmente disseminato tutto intorno il tuo codice altrove. –

2

Fatevi un favore e tenere le due cose insieme:

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

Poi si tenerli in una sola lista (List<NameAndDate>):

Se si desidera ordinare il nome, aggiungere un'implementazione IComparer a NameAndDate, quindi puoi semplicemente chiamare Sort() sulla lista.

Se si desidera mantenere l'accesso al nome e la data, aggiungi metodi di accesso a Risultati, come

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

È possibile creare un tipo personalizzato per contenere un valore, o se avete solo bisogno di usarlo nell'ambito di un singolo metodo è possibile utilizzare un tipo anonimo come segue.

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

Da qui i due valori non sono più legati. Ora puoi ordinarli.

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

o qualsiasi altra cosa tu abbia bisogno di fare con loro.

0

è possibile utilizzare il dizionario con Nome chiave, e il valore Data

e U può, dopo quella sorta facilmente

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

è un modo semplice per ottenere ciò che si vuole, ma per chiarezza si sono probabilmente meglio fare un tipo personalizzato per ospitarli come ad esempio:

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

allora si potrebbe utilizzare:

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

Creare una classe denominata "Risultato" con due proprietà

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

Ora si può creare una lista di questa classe

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

Ora nel tuo caso, se si vuole, si può leggere il contenuto del tuo elenco individuale e lo metti nella nostra nuova lista. (Questo è puramente specifico per il tuo caso, se vuoi davvero spostare i dati dai vecchi elenchi al nostro nuovo Elenco. Se possibile, puoi aggiornare il codice in cui carichi i dati in due List (che è il modo corretto) in modo che dati di carico al nostro nuovo elenco di tipo Risultato ed evitare questo codice porting per spostare i dati al nuovo elenco.

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

È possibile accedere alle voci della nuova lista come questa

objListResult[2].Date 

vi darà la Data memorizzata per il secondo oggetto nell'elenco

objListResult[2].Name 

vi darà il nome memorizzato per il secondo oggetto nella lista

+0

Come mai questo oro non è stato svalutato anche una volta ... –

6

Utilizzare il Array.Sort overload che accetta un array di chiavi e un array di valori, lo fa esattamente ciò che si vuole. (Questo metodo è disponibile da .NET 2.0.)

+2

Grazie per aver risposto alla domanda come è stato dichiarato. Assegnare Nome e Data insieme come suggeriscono le altre risposte è generalmente un buon consiglio, ma ci sono situazioni in cui la memorizzazione di due array simmetrici ha senso. In particolare, utilizzando un layout di dati "Structure of Arrays" in un algoritmo intensivo di calcolo. –

+1

Perfetto. Esattamente quello che stavo cercando. Non sapevo che questa funzione esistesse. – Timo