String.Contains gibt "falschen" Wert zurück?

  • C#
  • .NET 2.0

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Kenaex.

    String.Contains gibt "falschen" Wert zurück?

    Hey,

    Ich möchte prüfen, ob eine Formel in Form eines Strings eine Variable enthält.
    Wenn nicht, soll das Programm eine Fehlermeldung ausspucken, wenn x da ist, solls einfach weiterarbeiten

    Folgendermaßen sieht mein Ansatz also aus:

    C#-Quellcode

    1. ​string Formula = "x*x*PI";
    2. if (!Formula.Contains('x')) {
    3. OutputErrorMessage("Die Variable X muss in der Formel vorkommen.");
    4. return;
    5. }


    Das ganze funktioniert aber irgendwie nicht allzu richtig.
    In der Formel steht x drin, sogar zwei mal. Die Fehlermeldung kommt aber trotzdem.

    Warum?

    Grüße
    Felix
    Grüße
    Felix
    Bei mir funktioniert der Code einwandfrei in einer Konsole (mit nem using System.Linq).

    Teste mal, ob es mit Formula.Conatains("x") auch nicht funktioniert. (Beachte die Anführungszeichen anstatt der Hochkommas)
    Ansonsten, steht das so bei dir im Quellcode? oder bekommst du die Formel von einer Eingabe?
    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
    Also liegt die Formel im Quellcode vor?
    Du gibst doch einen Fehler aus, wenn eine Formel kein X hat. Demnach überprüfst du ja eine Usereingabe, oder? Poste doch mal den Weg von der Usereingabe bis zur Prüfung mit Contains.

    Oder lad alternativ eine bereinigte Solution mal hier hoch, wenn möglich.
    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
    Ist der Code wirklich ein Zitat aus dem Projekt oder liegt da vielleicht ein Groß-/Kleinschreibeunterschied vor? Denn X ist nicht x, auch nicht in einem Text.

    btw: Wozu LINQ? .Contains() ist doch (auch schon allein) eine Extension von String.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    String.Contains an sich funktioniert ausgezeichnet. Das was du gepostet hat sollte so wie es da steht sauber laufen. Der Fehler muss also von wo anders kommen. Was steht da sonst noch so in deinem Code was du nicht gepostet hast bzw. Ist das der "echte" (aus deinem Projekt kopierte) Code?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Kenaex schrieb:

    C#-Quellcode

    1. string Formula = "x*x*PI";
    2. if (!Formula.Contains('x')) {
    3. OutputErrorMessage("Die Variable X muss in der Formel vorkommen.");
    4. return;
    5. }


    Das ganze funktioniert aber irgendwie nicht allzu richtig.
    In der Formel steht x drin, sogar zwei mal. Die Fehlermeldung kommt aber trotzdem.
    Ich schliesse mich den anderen an: Was du da behauptest ist ausgeschlossen.
    Nimm das hin, das macht den Kopf frei, an anderen Stellen nach dem Fehler zu suchen, denn hier ist er sicher sicher nicht.
    Deine Frage lässt mich auch vermuten, du kennst das VisualStudio-Haltepunkt-Feature noch garnicht, weil sonst hättest du dich mal im Einzelschritt-Modus da durchgesteppt.
    Also falls ich mit meiner Vermutung richtig liege, kannst du aus diesem Video evtl. 'ne Menge nütlicher Dinge lernen: VisualStudio richtig nutzen (Google ist nicht deine Mami) (Also guck so oder so rein - Auch Erfahrenere Progger finden da immer noch die ein eine oder annere nützliche Kleinigkeit, die noch nicht gewusst war)
    Danke für die Antworten,

    Sowohl Haltepunkt als auch eine MessageBox vor dem if-Statement verraten mir, dass die Formel genauso aussieht, wie sie aussehen soll: x*x*PI.
    Oder soll ich da nach etwas anderem gucken?

    Hier der Code:

    C#-Quellcode

    1. public static Formel[] defaultFormulas = new Formel[2] {
    2. new Formel("Beschleunigung", "Berechnet die durchschnittliche Beschleunigung aus Zeit und Geschwindigkeit", "x/y", "Geschwindigkeit", "Zeit"),
    3. new Formel("Kreisflaeche", "Berechnet die Kreisflaeche aus dem Radius", "x*x*PI", "Radius")
    4. };
    5. // Die Kreisflächenformel nimmt diesen Konstruktor
    6. public Formel(string name, string beschreibung, string formel, string descriptionOfX)
    7. {
    8. foreach (Formel fm in FormulaList)
    9. {
    10. if (fm.Name.Equals(name))
    11. {
    12. OutputErrorMessage("Es gibt bereits eine Formel mit diesem Namen");
    13. return;
    14. }
    15. }
    16. Name = name;
    17. Description = beschreibung;
    18. Formula = formel;
    19. MessageBox.Show(Formula); // Testweise
    20. if (!Formula.Contains("x")) {
    21. OutputErrorMessage("Die Variable x muss in der Formel vorkommen.");
    22. return;
    23. }
    24. // Die Beschleunigungsformel nimmt diesen, dabei gibts keine Probleme
    25. public Formel(string name, string beschreibung, string formel, string descriptionOfX, string descriptionOfY = "DEFAULT", string descriptionOfZ = "DEFAULT")
    26. {
    27. foreach (Formel fm in FormulaList)
    28. {
    29. if (fm.Name.Equals(name)) {
    30. OutputErrorMessage("Es gibt bereits eine Formel mit diesem Namen");
    31. return;
    32. }
    33. }
    34. Name = name;
    35. Description = beschreibung;
    36. Formula = formel;
    37. if (!Formula.Contains("x"))
    38. {
    39. OutputErrorMessage("Die Variable X muss in der Formel vorkommen.");
    40. return;
    41. }


    Grüße
    Grüße
    Felix
    Hör mal bitte auf Code weg zu lassen. Wo sind Formula und FormulaList deklariert? Bitte den fehlenden Teil nachreichen.

    Edit: Bitte auch zeigen, wie/wo/mit was(Wert) der Konstruktor aufgerufen wird.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mrMo“ ()

    @Kenaex Deine Namensgebung ist wohl etwas suboptimal, ich denke, Du hast da einfach die falsche Variable am Wickel.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    mrMo schrieb:

    Edit: Bitte auch zeigen, wie/wo/mit was(Wert) der Konstruktor aufgerufen wird.
    Das ist doch gezeigt.
    Der Static-Initialisierer ruft die beiden Konstruktoren.
    Fehlen wirklich nurnoch das BackingFields, an das formel und dann könnten wir das auskopieren und bei uns selbst laufen lassen und das Wunder bewundern.
    @Kenaex: ja, wie wärs - kannste die fehlenden Dinge nicht noch dranmachen?

    Übrigens habich jetzt die Theorie, dass Formula eine Property ist, und für den Bug verantwortlich.
    Jo - jetzt haste doch recht, mrMo: ist blöd dass dieser Teil noch immer weggelassen ist.
    @Kenaex: Und falls Du fragst, warum denn irgendwelche scheinbaren Fitzeldetails von uns noch verlangt werden: Ich hab mir mal den Rest dazugedichtet. Und damit läuft's wie gewünscht. Also ist der Fehler immer noch in dem Teil versteckt, den Du noch nicht gezeigt hast. (btw. Ich hätte es noch komprimieren können, da die Konstruktoren größtenteils gleich sind, aber ich will beim TE keine Verwirrung stiften; das macht er schon ganz gut selber :P )
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace ConsoleApp1
    7. {
    8. class Program
    9. {
    10. private static List<Formel> FormulaList = new List<Formel>();
    11. static void Main(string[] args)
    12. {
    13. Formel f1 = new Formel("Formel 1", "Test1", "y+2", "x ist nicht vorhanden");
    14. Formel f2 = new Formel("Formel 2", "Test2", "x+2", "x ist ein Summand");
    15. Console.ReadKey();
    16. }
    17. class Formel
    18. {
    19. string Name;
    20. string Description;
    21. string Formula;
    22. public static Formel[] defaultFormulas = new Formel[2] {
    23. new Formel("Beschleunigung", "Berechnet die durchschnittliche Beschleunigung aus Zeit und Geschwindigkeit", "x/y", "Geschwindigkeit", "Zeit"),
    24. new Formel("Kreisflaeche", "Berechnet die Kreisflaeche aus dem Radius", "x*x*PI", "Radius")
    25. };
    26. // Die Kreisflächenformel nimmt diesen Konstruktor
    27. public Formel(string name, string beschreibung, string formel, string descriptionOfX)
    28. {
    29. foreach (Formel fm in FormulaList)
    30. {
    31. if (fm.Name.Equals(name))
    32. {
    33. OutputErrorMessage("Es gibt bereits eine Formel mit diesem Namen");
    34. return;
    35. }
    36. }
    37. Name = name;
    38. Description = beschreibung;
    39. Formula = formel;
    40. Console.WriteLine(Formula); // Testweise
    41. if (!Formula.Contains("x"))
    42. {
    43. OutputErrorMessage($"Die Variable x muss in der Formel {Formula} vorkommen.");
    44. return;
    45. }
    46. // Die Beschleunigungsformel nimmt diesen, dabei gibts keine Probleme
    47. }
    48. public Formel(string name, string beschreibung, string formel, string descriptionOfX, string descriptionOfY = "DEFAULT", string descriptionOfZ = "DEFAULT")
    49. {
    50. foreach (Formel fm in FormulaList)
    51. {
    52. if (fm.Name.Equals(name))
    53. {
    54. OutputErrorMessage("Es gibt bereits eine Formel mit diesem Namen");
    55. return;
    56. }
    57. }
    58. Name = name;
    59. Description = beschreibung;
    60. Formula = formel;
    61. if (!Formula.Contains("x"))
    62. {
    63. OutputErrorMessage($"Die Variable x muss in der Formel {Formula} vorkommen.");
    64. return;
    65. }
    66. }
    67. private void OutputErrorMessage(string v)
    68. {
    69. Console.WriteLine(v);
    70. }
    71. }
    72. }
    73. }


    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hey,
    danke für die Antworten.. und die Kritik.
    Jetzt grade sieht die gesamte Klasse so aus:


    C#-Quellcode

    1. public class Formel
    2. {
    3. public static List<Formel> FormulaList = new List<Formel>();
    4. public static Formel[] defaultFormulas = new Formel[2] {
    5. new Formel("Beschleunigung", "Berechnet die durchschnittliche Beschleunigung aus Zeit und Geschwindigkeit", "x/y", "Geschwindigkeit", "Zeit"),
    6. new Formel("Kreisflaeche", "Berechnet die Kreisflaeche aus dem Radius", "x*x*PI", "Radius")
    7. };
    8. public readonly bool hasX, hasY, hasZ; // readonly, damit sie nicht aus Versehen geändert werden können
    9. public string NameOfX, NameOfY, NameOfZ; // Beschreibungen der Variablen, DEFAULT, wenn die Variable nicht genutzt wird
    10. public string Name; // Name der Formel
    11. public string Description; // Beschreibung der Formel
    12. public string Formula; // Die Formel selbst als Text
    13. public Formel(string name, string beschreibung, string formel, string descriptionOfX)
    14. {
    15. foreach (Formel fm in FormulaList)
    16. {
    17. if (fm.Name.Equals(name))
    18. {
    19. OutputErrorMessage("Es gibt bereits eine Formel mit diesem Namen");
    20. return;
    21. }
    22. }
    23. Name = name;
    24. Description = beschreibung;
    25. Formula = formel;
    26. MessageBox.Show(Formula); // Testweise
    27. if (!Formula.Contains("x")) {
    28. OutputErrorMessage("Die Variable x muss in der Formel vorkommen.");
    29. return;
    30. }
    31. if (String.IsNullOrWhiteSpace(descriptionOfX) || String.IsNullOrEmpty(descriptionOfX))
    32. {
    33. OutputErrorMessage("Keine Beschreibung für Variable x gegeben.");
    34. return;
    35. }
    36. NameOfX = descriptionOfX;
    37. hasX = true;
    38. if (Formula.Contains("VAR_Y"))
    39. hasY = true;
    40. if(Formula.Contains("VAR_Z"))
    41. hasZ = true;
    42. FormulaList.Add(this);
    43. }
    44. public Formel(string name, string beschreibung, string formel, string descriptionOfX, string descriptionOfY = "DEFAULT", string descriptionOfZ = "DEFAULT")
    45. {
    46. foreach (Formel fm in FormulaList)
    47. {
    48. if (fm.Name.Equals(name)) {
    49. OutputErrorMessage("Es gibt bereits eine Formel mit diesem Namen");
    50. return;
    51. }
    52. }
    53. Name = name;
    54. Description = beschreibung;
    55. Formula = formel;
    56. if (!Formula.Contains("x"))
    57. {
    58. OutputErrorMessage("Die Variable x muss in der Formel vorkommen.");
    59. return;
    60. }
    61. if (String.IsNullOrWhiteSpace(descriptionOfX) || String.IsNullOrEmpty(descriptionOfX)) {
    62. OutputErrorMessage("Keine Beschreibung für Variable x gegeben.");
    63. return;
    64. }
    65. NameOfX = descriptionOfX;
    66. hasX = true;
    67. if (Formula.Contains("VAR_Y"))
    68. {
    69. if (descriptionOfY.Equals("DEFAULT") || String.IsNullOrWhiteSpace(descriptionOfY) || String.IsNullOrEmpty(descriptionOfY)) {
    70. OutputErrorMessage("Keine Beschreibung für Variable y gegeben.");
    71. return;
    72. }
    73. NameOfY = descriptionOfY;
    74. hasY = true;
    75. }
    76. if (Formula.Contains("VAR_Z"))
    77. {
    78. if (descriptionOfZ.Equals("DEFAULT") || String.IsNullOrWhiteSpace(descriptionOfZ) || String.IsNullOrEmpty(descriptionOfZ)) {
    79. OutputErrorMessage("Keine Beschreibung für Variable z gegeben.");
    80. return;
    81. }
    82. NameOfZ = descriptionOfZ;
    83. hasZ = true;
    84. }
    85. FormulaList.Add(this);
    86. }
    87. private static void OutputErrorMessage(string message)
    88. {
    89. MessageBox.Show(message, "Fehler bei der Erstellung einer Formel", MessageBoxButtons.OK, MessageBoxIcon.Error);
    90. // Später noch Fehlerbehandlung
    91. }
    92. }


    Ich hoffe das hilft jetzt weiter
    Grüße
    Felix