2010-09-28 1 views
11

È possibile creare un arraylist multidimensionale in C#?Come si crea un elenco di array multidimensionali in C#?

StartDate Qty size 
9/1/2010 10  15 
9/1/2009 12  17 
9/1/2008 11  19 

StartDate, Qty e size sono i 3 ArrayLists. Ho bisogno di averli in un singolo arraylist. Avrei anche bisogno di ordinare questo arraylist per StartDate. È possibile? C'è un modo migliore per farlo oltre all'arrayist?

risposta

30

Si può fare in questo modo, sì. Ma in questo caso dal momento che ogni fila sembra essere legata, perché non creare una classe per contenere i dati:

public class Info 
{ 
    public DateTime StartDate { get; set; } 
    public int Qty { get; set; } 
    public int Size { get; set; } 
} 

E poi basta avere un elenco regolare per contenere gli oggetti:

List<Info> infoList = new List<Info>(); 

che vi farà risparmiare da doversi preoccupare per l'ordine di ogni lista. Per gestire l'ordine, è possibile utilizzare i metodi LINQ to Extension:

var sortedList = infoList.OrderBy(i => i.StartDate); 
+0

Dang esso ... mi ha battuto ad esso. :-p (+1 per avere dita più veloci di me.) – JasCav

+0

Per ordinare questo per Startdate: var sortedList = infoList.OrderBy (x => x.StartDate) – HitLikeAHammer

+0

Apparentemente è in ordine decrescente quindi dovresti usare 'OrderByDescending() '. –

1

Si desidera un elenco di elenchi. Neanche un motivo per usare ArrayList. Dal tuo esempio:

List<List<DateTime>> list = new List<List<DateTime>>(); 

Detto questo, preferisco qualcosa come Justin ha mostrato sopra.

1

Se queste proprietà descrivono un'entità o "riga di dati", si potrebbe prendere in considerazione la creazione di una classe:

public class MyClass 
{ 
    public DateTime StartDate {get;set;} 
    public int Qty {get;set;} 
    public int Size {get;set;} 
} 

È quindi possibile creare un array di questi oggetti:

List<MyClass> myClassArray = new List<MyClass>(); 
0

Si potrebbe usare a SortedList<> e un oggetto aggiunto ad esso che ha le istanze 3 List<>. Quindi devi scrivere un comparatore per ordinare i tuoi oggetti per StartDate

2

Quando puoi, vai con la risposta di Justin. A lungo andare salverà il mal di testa perché ogni proprietà ha un significato. Se è necessario un approccio rapido e si dispone di .NET 4, è possibile elencare lo Tuple in un elenco. Ad esempio

List<Tuple<DateTime, int, int>> myData = new List<Tuple<DateTime, int, int>>(); 
myData.Add(new Tuple<DateTime, int, int>(DateTime.Now, 1, 2)); 

// 

DateTime myDate = myData[0].Item1; 
int myQty = myData[0].Item2; 
int mySize = myData[0].Item3; 

Se non si dispone di .NET 4, è banale implementare la propria tupla. Tuttavia, se hai intenzione di farlo, potrebbe anche saltare in cima e andare con la risposta di Justin.

Modifica Per completezza, ecco le opzioni di ordinamento che utilizzano questo approccio.

// descending sort done in place using List<>.Sort 
myData.Sort((t1, t2) => -1 * t1.Item1.CompareTo(t2.Item1)); 

// descending sort performed as necessary in a sequence 
var orderedList = myData.OrderByDescending(t => t.Item1); 
+0

Se ci vantiamo di .NET 4 ... perché non dovresti usare 'var myData = ...'? – WernerCD

+1

Non mi piace particolarmente 'var' e in genere lo uso solo quando si tratta di query (e talvolta nemmeno di allora). Per tutto il resto, preferisco essere esplicito in ogni momento. –

+0

Capisco che in alcuni casi, l'esplicito è meglio ... Indovina la sua giusta preferenza che non è necessario digitare l'Elenco > due volte - una volta su ciascun lato del =. – WernerCD

0
public struct MyStruct 
{ 
    public DateTime StartDate { get; set; } 
    public int Qty { get; set; } 
    public int Size { get; set; } 
} 
... 
List<MyStruct> MyList = new List<MyStruct>(); 
... 
MyList.Sort((item1, item2) => item1.Qty.CompareTo(item2.Qty)); //ascending sort 
... 
MyList.Sort((item1, item2) => item2.Qty.CompareTo(item1.Qty)); //descending sort 
+1

MUTABLE STRUCT! Raccogli le tue donne e i tuoi figli e portali in salvo! –

+0

@Anthony Pegram: penso che sia un'ottimizzazione e aumenterà le prestazioni nelle azioni di ordinamento. correggimi se sbaglio. – syntaxcheck

+0

Non ho idea delle prestazioni di struct rispetto a class in una situazione di ordinamento, tranne che per testarlo e vedere in vari scenari, a cui non posso accedere. Ma il mio commento si riferisce al fatto che le strutture mutevoli sono considerate malvagiemente. Vedi questa domanda e le risposte e i post sui blog collegati, ecc. Per ulteriori informazioni. http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil –