Autor Beitrag
pepe-je
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Sa 19.09.09 10:58 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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:

_________________
Gruß
Christoph
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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".


Zuletzt bearbeitet von JüTho am Sa 19.09.09 12:32, insgesamt 1-mal bearbeitet
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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


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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Sa 19.09.09 20:30 
Hallo,
Euch allen vielen Dank für Eure Hilfe
Gruß,
Peter