C# Hilfe?

2 Antworten

Aber wie setze ich es um, dass auch nur ein Teil des Titels übergeben wird und trotzdem das richtige Buch zurückgegeben wird?

Dir steht es natürlich frei eine eigene Suchmethode zu implementieren, welche in mehreren Schritten nachschaut ob einzelne Teile Deines Suchstrings in einem Buchtitel (anderer String) enthalten sind.

So weit müssen wir uns jedoch ganicht aus dem Fenster hängen. Die meisten Sprachen, so auch C#, definieren die Möglichkeit mit RegEX auf die Suche zu gehen.

zu RegEx muss ich mich nicht weiter äußern 🤪🙄

Für die etwas simpleren Wildcards (Joker) * und ? hat C# keine direkten Methoden. Aber eine Conversion der beiden Joker-Zeichen zu RegEx ist kein Akt:

private static String WildCardToRegular(String value) {
  return "^" + Regex.Escape(value).Replace("\\?", ".").Replace("\\*", ".*") + "$"; 
}

und deren Verwendung

  String test = "Die Mär von Ulenspiegel und Lamme Goedzak und ihren heroischen, ergötzlichen und rühmlichen Abenteuern in Flandern und anderen Landen";

//Den Titel möchtest Du mit einem  direkten  stringvergleich  sicher nicht finden 😱

  Boolean myMatch = Regex.IsMatch(test, WildCardToRegular("*ulenspiegel*abenteuer*"));

...oder man ist ganz frech und missbraucht Methoden anderer in C# vorhandener Klassen (Dateinamen wurden schon immer mit per Joker verglichen) Was liegt da näher sich dieser Methode zu bedienen:

bool myMatch = FileSystemName.MatchesSimpleExpression("*ulenspiegel*abenteuer*", test);

Der monströse Buchtitel ist übrigens echt: https://www.projekt-gutenberg.org/coster/ulenspie/ulenspie.html

Für einen unbedarften Nutzer ist es einfacher in einem Suchfeld mit Wildcards zu agieren. ansonsten ist es deiner Fantasie überlassen

Hier noch ein kleines Beispiel für die Auswertung eines Suchstrings , welcher für den Nutzer völlig ohne Regex und Wildcards auskommt.


Palladin007  14.10.2023, 01:12

Ist Regex hier nicht ein paar Nummern zu weit?

Ja, im ersten Link steht alles nötige drin, aber die Regex-Infos gehen vermutlich links rein, drehen ein paar Runden und danach rechts wieder raus.

Und ich habe Leute mit mehreren Jahren Erfahrung (diskussionswürdig, aber so ist die Welt) gesehen, die nicht mit Regex arbeiten konnten.

0
Erzesel  14.10.2023, 10:28
@Palladin007

Diese Überlegung hatte ich auch und habe deshalb Möglichkeiten aufgezeigt, wie man eine Übersetzung von Jokern oder durch Leerzeichen getrennte Worte in RegEx übersetzen kann.

Für einen Entwickler sollte das keine Hürde darstellen.

Für einen Nutzer hingegen erleichtert der Verzicht auf RegEx im Eingabefeld für die Suchbegriffe eine enorme Erleichterung.

Aber wieder zum Code behind (für den Entwickler einer Suchroutine)...

habe Leute mit mehreren Jahren Erfahrung

RegEx ist kein Hexenwerk, wenn man erstmal den Bogen raus hat. Lookarrounds braucht man bei einfachen Textsuchen normalerweise nicht

Etwas wie

(?=.*string1)(?=.*string2).*

...ist lediglich eine Krücke, weil es im Regex keine and-Operator geben kann aber die Abfolg der gesuchten Strings unerheblich sein soll. (RegEx arbeitet sich immer von links nach rechts durch den QuellString und das Pattern)

Positive LookAheads laufen jeweils erneut über den gesamten QuellString und merken sich nicht den Inhalt des vorangegangenen PLA, sondern nur ob die aktuelle Bedingung im Pattern matched oder nicht.

Das heist , wenn string2 vor string1 im Quellstring steht, ist er für die Gruppe mit string1 in den beliebigen Zeichen . * enthalten (Match) und die der Gruppe mit string2 ist es wegen des .* egal ob string1 davor steht oder nicht... Hauptsache beide Gruppen haben für sich ein Match zu verzeichnen... (Damit haben wir unser "and")

RegEx ist geil😅 (man muss nur um die Ecke denken🤪)

...aber Du hast schon recht...RegEx kommt gleich nach Brainfuck... und kann gestandene Programmierer in die Klapsmühle befördern...

Zur Not gibt's Leute die entlassen wurden, die man fragen kann

0

Die Idee ist schon nicht schlecht. Du erstellst ein Feld in der Klasse BookShop, welches auf eine Liste aller verfügbaren Bücher zeigt. Für die Suche gehst du über jedes Buch und vergleichst den Buchtitel mit dem Suchbegriff.

Für die Vergleichsfunktion brauchst du eine andere String-Methode. IndexOf würde sich anbieten.