Hallo,
ich hab ein kleines Problem mit einem Array[,] das ich irgendwie sortieren/zusammenfassen muss. Das Array sieht folgendermaßen aus:
string[,] array = new string[x,2];
In einer Schleife fülle ich nun das Array. Das sieht dann so aus:
array[y, z] = id[i];
z++;
array[y, z] = wert[i];
z = 0;
y++;
Also hab ich jetzt ein Array das so aussieht:
| ID | Wert |
|23 | 3422 |
|23 | 5212 |
|46 | 938 |
|46 | 4354 |
|46 | 332 |
|8 | 454 |
usw...
Jetzt das Problem: Ich will alle Werte für eine ID zusammenzählen und diese in ein neues Array[,] speichern. Das das mit einem String Array nicht funktioniert, ist mir schon klar. Das zweite Array sollte dann so aussehen:
| ID | WERT |
|23 | 8634 |
|46 | 5624 |
|8 | 454 |
Für einen Lösungsansatz wäre ich wirklich dankbar!
Du kannst das Array durchgehen und die ID des Aktuellen und des nächsten Feldes vergleichen wenn sie gleich sind addieren und ins neue Array schreiben
Wir Arbeiten eigendlich nicht wir nehmen nur das geld
Wenn du die Summe der einzelnen "ID-Arrays" nur ab und an mal brauchst aber das 2-dimensionale Array ansich
relativ oft, wär es (so finde ich halt) fast am einfachsten du machst ein 1-dimensionales draus. Zum Beispiel so:
using System.Collections.Generic;
public struct DataObject : IComparable<DataObject>
{
private int value;
private int id;
// Properties, etc. spar ich mir jetzt mal ..
public int CompareTo(DataObj obj) {
return id.CompareTo(obj.id);
}
}
Jetzt kannst das DataObject-Array ebenfalls ganz leicht mit Array.Sort sortieren und musst
halt nur noch die Additionen vornehmen, was nicht viel mehr als eine Schleife ist.
Wenn du allerdings nur diese komische Summe benötigst, wäre herbivores Vorschlag sicher angemessener.
grüße
hashtable kommt jetzt für mich nicht in frage. das muss doch auch anders gehen, oder?!
Ja ganz einfach du kannst doch sicher ein Array Sortieren wenn du es dann nach der ID Nummer Sortiert hast kannst du das Array durchgehen und die Werte mit gleicher ID Addieren und in ein Neues Array Schreiben
Wir Arbeiten eigendlich nicht wir nehmen nur das geld
also... soweit bin ich jetzt schonmal. in das neue array strada[,] soll das resultat geschrieben werden (siehe erster post, ganz unten). in das array tempid[] schreibe ich alle IDS rein. theoretisch müsste er jetzt jedes mal das array tempid durchsuchen, ob die ID darin schon existiert. wenn ja, holt er sich den wert strada[i,1], addiert ihn mit dem des arrays myarray und schreibt ihn wieder in das array strada.
leider bekomm ich immer einen fehler (Index außerhalb des Arraybereichs) in der zeile, die ich markiert habe. vielleicht könnt ihr mir bisschen helfen!
int a = 0;
int b = 0;
int calc = 0;
string[,] strada = new string[5,2];
string[] tempid = new string[details.Count];
for (int i = 0; i < details.Count; i++)
{
Array.Sort(tempid);
object obj1 = myarray[i,0];
int retval = Array.BinarySearch(tempid, obj1);
if (retval >= 0)
{
tempid[i] = "got";
calc = Convert.ToInt32(strada[retval, 1]); //FEHLER
calc = calc + Convert.ToInt32(myarray[i,1]);
strada[retval, 1] = calc.ToString();
}
else
{
tempid[i] = myarray[i,0];
strada[a, b] = myarray[i,0];
b++;
strada[a, b] = myarray[i,1];
b = 0;
a++;
}
}
return strada;
achja, in myarray[,] sind alle ids und werte enthalten wie beim ersten post oben die erste tabelle.
Hallo Taxi4110,
mir ist nicht ganz klar, was dein Code ganau machst. Aber wenn du bei der zweidimensionalen-Array-Varianten bleiben willst, musst du ja beide Arrays parallel sortieren. Und dafür gibt es m.E. nichts vorgegebenes, d.h. du musst den ganzen Sortieralgorithmus selbst schreiben. Davon möchte ich dringend abraten.
Wenn du meinen Vorschlag von oben nicht umsetzen willst, dann pack alles wie gehabt in das zweidimensionale Array, aber benutzte für den Sortierungsschritt die Hashtable wie oben beschrieben.
herbivore
Hi Taxi4110,
ich würde es so machen wie Bernhard es vorschlägt.
Ersetz' das zweidimensionale Array durch ein eindimensionales, das Datenobjekte hält. Eindimensionale Arrays können leicht per Array.Sort und IComparer sortiert werden.
Wenn es von der Logik her eher eine Matrix ist und keine Liste von Objekten, kannst du auch ein geschachteltes Array verwenden (geschachtelte Arrays sind ohnehin den mehrdimensionalen Arrays vorzuziehen).
Ich hab es testweise mal programmiert, ist gar nicht mal so viel Code:
private const int COL_ID = 0; // Index ID-Spalte
private const int COL_SUM = 1; // Index Sum-Spalte
// Table nach ID-Spalte gruppieren und aufsummieren.
// Statt int[,] wird int[][] verwendet.
static int[][] SumByID(int[][] table) {
ArrayList result = new ArrayList();
// table nach ID-Spalte sortieren (Index 0).
Array.Sort(table, new IdComparer());
// table nach ID-Spalte aufsummieren.
int[] resultRow = null;
foreach(int[] row in table) {
// Für jede ID eine neue Reihe
// zum Ergebnis hinzufügen.
if(resultRow == null ||
resultRow[COL_ID] != row[COL_ID]) {
resultRow = new int[] { row[COL_ID], 0 };
result.Add(resultRow);
}
// Aufsummieren.
resultRow[COL_SUM] += row[COL_SUM];
}
// Ergebnis als Array zurückgeben.
int[][] array = (int[][])result.ToArray(typeof(int[]));
return array;
}
// IdComparer zum Sortieren nach ID-Spalte (Index 0).
class IdComparer : IComparer {
public int Compare(object a, object b) {
int[] rowA = (int[])a;
int[] rowB = (int[])b;
int v = Compare(rowA, rowB);
return v;
}
public int Compare(int[] a, int[] b) {
int v = a[COL_ID] - b[COL_ID];
return v;
}
}
Ich hab das komplette Beispiel angehängt.
Gruss
Pulpapex
-fred rauskram-
würde hier gerne mal nachhaken: wie würde denn die syntax aussehen für eine liste von listen? struktur sollte eine simple list<int> seien, die ihrerseits in einer list enthalten ist..?
Hallo moeb1us,
List <List <int>>
herbivore