Entwickler-Ecke
Basistechnologien - Werte in einer Spalte einer DataTable
pepe-je - Sa 19.09.09 10:58
Titel: Werte in einer Spalte einer DataTable
Ich habe folgendes Problem.
Es sollen die vorkommenden Werte in einer Spalte Id einer DataTable ermittelt und in ein Array id[] geschrieben werden. In der Spalte kommen bestimmte Werte mehrfach vor.
Zur Erläuterung ein Beispiel
Id
3
2
2
4
3
2
Da drei Werte vorkommen, hat das Array id[] die Länge 3 und es ist
id[0] = 3 id[1] = 2 id[2] = 4
Weiß jemand, wie man die Aufgabe allgemein lösen kann?
Schon jetzt vielen Dank
Christoph1972 - Sa 19.09.09 11:36
Hi,
wo ist das konkrete Problem? Einfach mit einer Schleife das Array vollpacken und prüfen ob der Wertvorhanden ist. Das Array sollte eigentlich eine Länge von 2 haben oder [3]-1 :wink:
JüTho - Sa 19.09.09 11:54
Hallo und :welcome:
Es geht faktisch nur manuell über eine Schleife, wie Christoph sagt.
Direkt mit DataTable geht es faktisch nur manuell über eine Schleife, wie Christoph sagt.
Es geht nicht über DataTable.Select oder DataView.Sort oder ähnliches, weil DataColumn.Expression keine Möglichkeit für DISTINCT vorsieht. Der Grund dafür liegt darin, dass ein DataSet keine SQL-Datenbank ist. Diese arbeitet mengenorientiert; aber unter NET muss mit einzelnen Objekten gearbeitet werden.
Tipp: Arbeite nicht mit einem Array, sondern mit einer List<int>. Am Anfang weißt du nicht, wie viele IDs du bekommen wirst. Ein Array musst du mit einer festen Länge vorbelegen; bei einer List<T> kannst du beliebig neue Werte hinzufügen.
Gruß Jürgen
/Edit
Sebastian hat mir schon wieder gezeigt, dass sich meine Kenntnisse verringern. Ich muss wohl etwas vorsichtiger sein mit allgemeinen Äußerungen "geht nicht".
Kha - Sa 19.09.09 12:15
pepe-je hat folgendes geschrieben : |
| Weiß jemand, wie man die Aufgabe allgemein lösen kann? |
Darf's Vorgefertigtes sein ;) ?
Enumerable.Distinct [
http://msdn.microsoft.com/en-us/library/bb348436.aspx]
Christoph1972 hat folgendes geschrieben : |
| wo ist das konkrete Problem? |
Das Problem ist, dass du gerade einen O(n²)-Algorithmus beschrieben hast, wo (wie Enumerable.Distinct zeigt) O(n) möglich wäre ;) . Wahrscheinlich reden wir hier über Datenmengen, bei denen der Unterschied nichtig ist, aber da er ja nach einem allgemeinen Verfahren fragt, wollte ich das nicht unerwähnt lassen.
Eine naive Distinct-Implementierung[*], falls die Reihenfolge beibehalten werden soll:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| public static IEnumerable<TSource> Distinct<TSource> (this IEnumerable<TSource> source) { var items = new HashSet<TSource> (); foreach (var element in source) { if (! items.Contains (element)) { items.Add (element); yield return element; } } } |
Und falls nicht:
new HashSet<TSource>(source).ToArray()
[*]Die gewöhnungsbedürftige Formatierung geht aufs Konto der Mono-Leute :P .
pepe-je - Sa 19.09.09 20:30
Hallo,
Euch allen vielen Dank für Eure Hilfe
Gruß,
Peter
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!