Ordinamento di una matrice multi-dimensionale in C #, composta da numeri interi

Ho il seguente array:

private int[,] testSamples = new testSamples[101,101]; 

Dovrebbe rappresentare un roster, con la colonna da 0 a 100 e la riga da 0 a 100. In questo elenco, vengono rilasciati vari liquidi chimici. La persona che sto facendo per questo vuole lavorare in modo tale che possa prendersi cura del contenitore con il più liquido al suo interno.

Quindi, ho bisogno di ottenere i dati e stampare in questo modo:

 testSamples[35,40] = 12 testSamples[11,12] = 11 testSamples[92,14] = 10 testSamples[18,3] = 10 testSamples[1,61] = 7 ... 

Per esempio. Ci ho pensato per alcuni giorni, ho esaminato alcune altre domande qui su StackoverFlow, ma non riesco a far funzionare nessuno di loro.

C’è un modo per farlo, o dovrei rinunciare agli array e andare per un altro tipo di contenitore, come ArrayLists o List items?

Ecco un suggerimento che penso finisca per essere abbastanza simile a quello di Richard, ma senza usare LINQ.

Scrivi una struttura rapida (qualcosa di simile potrebbe anche esistere già) che include tre valori: x, y e valore. Come questo:

 public struct SampleSlot : IComparable { public int X; public int Y; public int Value; public SampleSlot(int x, int y, int value) { X = x; Y = y; Value = value; } public int CompareTo(SampleSlot other) { return Value.CompareTo(other.Value); } } 

Quindi puoi comprimere l’array int[,] in qualsiasi collezione ordinabile monodesmensionale di oggetti SampleSlot che ti piacciono; Probabilmente andrei con una List :

 List slotsList = new List(); for (int i = 0; i < testSamples.GetLength(0); ++i) { for (int j = 0; j < testSamples.GetLength(1); ++j) { slotsList.Add(new SampleSlot(i, j, testSamples[i, j])); } } slotsList.Sort(); // assuming you want your output in descending order for (int i = slotsList.Count - 1; i >= 0; --i) { SampleSlot slot = slotsList[i]; Console.WriteLine("testSamples[{0},{1}] = {2}", slot.X, slot.Y, slot.Value); } 

Puoi farlo, ma hai bisogno di un contenitore per contenere le coppie di indici di output, un modo rapido per farlo è un tipo anonimo e LINQ:

 var sorted = from x in Enumerable.Range(0, testSamples.GetLength(0)) from y in Enumerable.Range(0, testSamples.GetLength(1)) select new { X = x, Y = y, Value = testSamples[x,y] } into point orderby point.Value descending select point; 

Dopo questo sorted un object IEnumerable di tipo anonimo è costituito dagli indici e dal valore dell’array.

EDIT: Metti il ​​primo più grande …

Probabilmente staresti meglio usando qualcosa come OrderedBag . Inoltre, potresti volere che il tuo elenco memorizzi qualcosa di diverso dai semplici numeri interi. Sembra che ci sia un object logico più complicato che stai cercando di rappresentare, come un raccoglitore, un esperimento, un bicchiere o qualcosa del genere.

Aggiornamento: modificato in base ai commenti riguardanti SortedList per utilizzare invece un OrderedBag.

Supponiamo 3×3:

 5 4 3 2 1 9 8 7 6 

È ansible memorizzare le coordinate in un SortedDictionary con dimensioni del liquido chiave, coordinate del valore:

 key - value 9 - [2,1] 8 - [0,3] ...