String Suche

Hallo Zusammen,

ich habe folgendes Problem. Ich habe eine Klasse Fahrzeuge in der ich die Variablen Fahrzeugtype, Model, Einkaufspreis usw. deklariert habe. Nun habe ich Objekte dieser Klasse erstellt und in ein Arraylist abgelegt (zum speichern in eine XML).

Nun will ich über eine Textbox nach bestimmten Kriterien des Benutzers filtern, damit diese dann in einer Listbox angezeigt werden. Ich habe es folgendermaßen Probiert, dass ich die Variablen in einem String miteinander verkettet habe und anschließen mit der .Contains Methode abgefragt habe ob die Textbox.text = der String Variable ist. Jedoch bin ich an folgende Probleme gestoßen:

  1. Groß und Kleinschreibung wird nicht ignoriert
  2. Reihenfolge der abgelegten Variablen in dem String spielt eine rolle z.B. TestString = Fahrzeugtype & Model ist richtig wenn der Benutzer in der Textbox die Reihenfolge (Fahrzeugtype & Model)eingibt jedoch wenn der Benutzer das Model zuerst eingibt und anschließend den Fahrzeugttype findet er das Objekt nicht.

Nun folgende Frage gibt es eine Methode die die Groß und Kleinschreibung Ignoriert? Und wie könnte ich das Problem mit der Reihenfolge lösen? Hoffe ihr versteht mein Problem, ansonsten einfach mal schreiben.

Mit freundlichen Grüßen
Harald

Am besten du wandelst die Werte in strtolower um (nur zur Laufzeit) und prüfst sie dann auf gleichheit.

weiters würde ich die Sucheingabe alla Google optimieren.
Sprich du teilst der Suchbegriff auf also
AUTO BESCHREIBUNG BLAWERT

Teilen über LEERZEICHEN und du hast 3 werte.

Diese 3 Werte überprüfst du mit den Werten aus der Datenbank und gibst die dementsprechende Verbindung zurück.

Du hast nachher ein Array aus übereinstimmungen, diese Übereinstimmungen wertest du wie, du willst, entweder, du findest den ersten Suchbegriff in AUTO und gibst ihm die höchste Priorität. Anderenfalls, wenn du den Wert in BESCHREIBUNG findest, gibst du ihn in einer niedrigeren Priorität zurück, falls keine Übereinstimmungen in AUTO.

Hoffe konnte helfen.
Gruß Sebastian

Hallo Sebastian,

ich hätte da Paar Fragen.

Ich benutze Vb.net

  1. Kennst du die Methode mit der man in toLower umwandeln kann? und des Weiteren benutze ich zur Speicherung der Daten eine XML-Datei.
  2. Mit welcher Methode könnte ich den die Suchbegriffe in 3 unabhängige Suchbegriffe unterteilen? Hättest du 1 Beispiel für mich?

Vielen Dank für deine Hilfe habe es bereits mit der Split Methode versucht gehabt, jedoch hat es nicht wirklich geklappt :smile:

danke im Voraus

Mit freundlichen Grüßen
Harald

Ich benutze Vb.net

  1. Kennst du die Methode mit der man in toLower umwandeln
    kann? und des Weiteren benutze ich zur Speicherung der Daten
    eine XML-Datei.

Also toLower in dot.net heist so weit ich weiß auch .ToLower()

z.B. (ich nehm als programmiersprache jetz mal c# das kann ich besser VB dürfte aber ähnlich aussehen)

string test = „aSdF“;
MessageBox.Show(test.ToLower());

konvertiert dir den string in kleinbuchstaben

Das mit dem toLower() ist erklärt.

Das Thema String teilen:

 Dim ar() As String
 Dim Str As String = "AUTO BESCHREIBUNG TITEL"
 Dim spltstr() As String = {" "}
 ar = Str.Split(spltstr, StringSplitOptions.None)

im ar stehen nun deine Werte. Einfach durch das Array iterieren und du siehst, das Array hat 3 Werte 0, 1, 2, also AUTO, BESCHREIBUNG, TITEL.

Gruß Sebastian

Super Danke hat geklappt mit dem Split :smile: :smile: :smile:

nun soweit ich das nun Verstanden habe muss ich nicht sowohl den Suchbegriff den der Benutzer eingibt als auch die Werte (Model, Hersteller… ) Spliten. Anschliend über eine Schleife suchen lassen ? Ist das richtig ? habe gerade herumprobiert find jedoch keine passende Lösung, da der Benutzer bei falscher Suchbegriff eingabe, kein Objekt angezeigt werden soll…

Mit freundlichen Grüßen
Harald

Super Danke hat geklappt mit dem Split :smile: :smile: :smile:

Schön. Das war ja nicht schwer. :smile:

nun soweit ich das nun Verstanden habe muss ich nicht sowohl
den Suchbegriff den der Benutzer eingibt als auch die Werte
(Model, Hersteller… ) Spliten. Anschliend über eine Schleife
suchen lassen ? Ist das richtig ? habe gerade herumprobiert
find jedoch keine passende Lösung, da der Benutzer bei
falscher Suchbegriff eingabe, kein Objekt angezeigt werden
soll…

Wie liegen denn die Daten vor?
Steht in deiner XML sowas:
oder stehts da so

wenn fall 1)
Dann musst du natürlich spliten.
wenn fall 2, dann einfach über indexOf() prüfen ob > -1, also:
if(indexOf() > -1) console.writeline(„JO gefunden in titel“), … usw.

Gruß Sebastian

PS: Die XML-Struktur wäre hilfreich.

Also ich würde sagen das meine XML die 2 Struktur entspricht, habe die Serialisierung mittels Soap benutzt.

For Each m As Fahrzeug In ArrayProdukte
suchstring = m.Hersteller & „,“ & m.Model
txtAuftragSuchfilter.Text.ToLower()
suchstring.ToLower()
ar = txtAuftragSuchfilter.Text.Split(splitstr,StringSplitOptions.None)
ba = suchstring.Split(splitstr, StringSplitOptions.None)

Das habe ich bis jetzt bei mir stehen, ich wollte nun die beiden Arrays miteinander vergleichen, nur dann wenn alle Elemente aus AR(Suchkriterien Benutzer) in ba vorkommen wird das Objekt in der Listbox geadded. Jedoch klappt da was mit dem Tolower bei mir nicht, was habe ich das falsch gemacht ?

Vielen Dank für eure hilfe :smile: :smile: :smile: thx

Mit freundlichen Grüßen
Harald

Strings sind immutable! So muss das sein:

Dim filter As String
filter = txtAuftragSuchfilter.Text.ToLower()
For Each m As Fahrzeug In ArrayProdukte
suchstring = (m.Hersteller & "," & m.Model).ToLower()
ar = filter.Split(splitstr,StringSplitOptions.None)
ba = suchstring.Split(splitstr, StringSplitOptions.None)

Wie wäre es mal mit einem Grundlagenbuch?
http://openbook.galileocomputing.de/visualbasic_2008/

Grüße, JasonDelife.

Ergänzung
Evtl. könntest du auch mit LINQ arbeiten.
Das scheint mir für sowas geeigneter.
Desweiteren würde ich dir empfehlen für jedes Kriterium eine eigene TextBox zu nehmen, da das erkennen (welcher Wert ist nun Hersteller, welcher Modell?) nicht so einfach zu programmieren ist. Das ist auch für den User einfacher (er weiß genau, nach was er filtern kann).
So in der Art (Achtung! C#-Code):

string hersteller = herstellerFilterTextBox.Text;
string model = modelFilterTextBox.Text;
var produkteGefiltert = ArrayFahrzeuge
 .Where(f =\> f.Hersteller.Equals(hersteller, StringComparison.CurrentCultureIgnoreCase))
 .Where(f =\> f.Model.Equals(model, StringComparison.CurrentCultureIgnoreCase))
 .Select(f =\> f);
foreach(var p in produkteGefiltert) {
 produkteListBox.Add(p); // Oder so...
}

Grüße, JasonDelife.