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

user profile iconpepe-je hat folgendes geschrieben Zum zitierten Posting springen:
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]


user profile iconChristoph1972 hat folgendes geschrieben Zum zitierten Posting springen:
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