Forum: PC-Programmierung C# String Compare aus Datatable geht schief


von Prog R. (daniel_v)


Lesenswert?

Hallo,

langsam weiß ich mir samt Google und was so dazukommt nicht mehr zu 
helfen:

Ich habe ein Datatable-Objekt, aus dem ich mir eine Row hole.
Diese ist mit verschiedenen Stringwerten befüllt.

Nun laufe ich eine Schleife durch die Spalten der Reihe und suche nach 
einem bestimmten Wert und dessen Index.
1
 DataTable dt = new DataTable();
2
            adapt.Fill(dt);
3
            DataRow row = dt.Rows[0];
4
            for (int i = 0; i < dt.Columns.Count; i++)
5
            {
6
7
                if (row.ItemArray[i].ToString() == "Suchwert")
8
                    index = i;
9
            }


Der gesuchte Wert ist vorhanden, nur der Stringcompare geht schief.
Ich komme nicht dahinter, was da nicht passen soll?
Auch mit string.Compare() haut das nicht hin - Groß-Kleinschreibung 
passt.
Der "Suchwert" kommt aus einer MSAccess Datenbank.

Hat jemand eine Erklärung?

danke

von Peter II (Gast)


Lesenswert?

Daniel V. schrieb:
> Hat jemand eine Erklärung?

lass dir die werte doch einfach mal ausgeben.

System.Diagnostic.Debug.WriteLine( row.ItemArray[i].ToString() );

von Dr. Sommer (Gast)


Lesenswert?

Vielleicht sehen die Strings nur gleich aus... lass dir mal eine 
binär/hex darstellung ausgeben (wegen unicode und so). Und ich weiss 
grad nicht wie das bei C# mit dem == ist - google mal nach C# reference 
equality. Denn in Java zB würde das so nicht gehen und du bräuchtest 
.equals()

von Prog R. (daniel_v)


Lesenswert?

danke erstmal.

Die Werte habe ich mir mit einer MessageBox schon ausgeben lassen und 
vorerst sieht da alles normal aus.

Weiteres geht der string compare in C# mit == tadellos und ich habe es 
jetzt auch mit
1
  if (string.Compare(row.ItemArray[i].ToString(), "Suchwert", true, CultureInfo.InvariantCulture) == 0)

versucht und das geht auch nicht.

Wie kann ich mir denn die Werte in Hex ansehen?
Bzw. warum sollte ein String aus einer Datenbank nicht einem String 
Objekt aus dem Code gleichen?
Ich schreibe sie ja rein auch auf die Weise....

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Daniel V. schrieb:
> Objekt aus dem Code gleichen?

z.b ein Leerzeichen davor oder dahinter

von Prog R. (daniel_v)


Angehängte Dateien:

Lesenswert?

Nein - hier im Anhang die Anzeige aus dem Debug.

Ich halt das nicht aus, wieso ist diese Bedingung bitte nicht erfüllt?
Irre Sch.... :)

von Prog R. (daniel_v)


Lesenswert?

So - Problem verstanden.


eigentlich recht witzige Geschichte - ich hab das Visual Studio 
blöderweise auf Release gestellt gehabt. (fürs Compilieren)

Da die Variable "index" nach dieser Funktion keine Verwendung mehr fand 
(aufgrund dass ich die Funktion ja gerade erst entwickle), hat mir der 
Compiler die Zuweisung dieser scheinbar weg optimiert.

Ein Console.Writeline(index.ToString()) nach dem if hat schon 
ausgereicht, damit es geht.

Wahnsinn, dafür hab ich jetzt einen halben Tag verbraucht :)

von Borislav B. (boris_b)


Lesenswert?

Daniel V. schrieb:
> Wahnsinn, dafür hab ich jetzt einen halben Tag verbraucht :)

Och ja, Lehrgeld ;-)
Das passiert einem nur einmal. Beim nächsten Mal weißt du bescheid.

von Dr. Sommer (Gast)


Lesenswert?

Boris P. schrieb:
> Das passiert einem nur einmal. Beim nächsten Mal weißt du bescheid.
Das ist ja bitter. C++ Debugger zeigen bei "index" dann wenigstens 
"optimized out" o.ä. an s.d. man weiß dass die Zuweisung nicht mehr 
existiert...

von Prog R. (daniel_v)


Lesenswert?

Dr. Sommer schrieb:

> Das ist ja bitter. C++ Debugger zeigen bei "index" dann wenigstens
> "optimized out" o.ä. an s.d. man weiß dass die Zuweisung nicht mehr
> existiert...

Naja - im Nachhinein betrachtet fällt mir auf, dass der Compiler in der 
Debugconsole unten, als er das if übersprungen hat, auch eine Ausgabe 
tätigte:
"Thread terminated at 0x2154....".

Allerdings lässt sich drüber streiten, ob man das, wenn man es nicht 
weiß, beachtet...
(vor allem hat man i.d.R. die Rücksprungadressen nicht im Kopf :D )

von Peter II (Gast)


Lesenswert?

Daniel V. schrieb:
> Naja - im Nachhinein betrachtet fällt mir auf, dass der Compiler in der
> Debugconsole unten, als er das if übersprungen hat, auch eine Ausgabe
> tätigte:
> "Thread terminated at 0x2154....".

das dürfte aber damit nicht zusammenhängen. Warum sollte sich am ende 
der Schleife ein Thread beenden? So mal die Meisten einfachen Programm 
nur einen Threads haben. Wenn diese beendet wird, ist das Programm weg.

von Severino R. (severino)


Lesenswert?

Versuch's doch mal mit
1
if (row.ItemArray[i].ToString().Equals("Suchwert"))

von Peter II (Gast)


Lesenswert?

Severino R. schrieb:
> Versuch's doch mal mitif
> (row.ItemArray[i].ToString().Equals("Suchwert"))

die Lösung war eine andere.

> Da die Variable "index" nach dieser Funktion keine Verwendung mehr fand
> (aufgrund dass ich die Funktion ja gerade erst entwickle), hat mir der
> Compiler die Zuweisung dieser scheinbar weg optimiert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.