Autor Beitrag
ebber
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: Fr 21.03.08 19:43 
Hallo

gibt es eine Möglichkeit switch und string.Contains zu verbinden ?

Also sowas wie

ausblenden C#-Quelltext
1:
2:
3:
4:
      switch (string.Contains)
            {
                case "xyz": dosth();
            }


MfG
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 21.03.08 19:51 
Mir würde da nur ein regulärer Ausdruck einfalle, siehe RegEx-Klasse in der Doku.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
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 22.03.08 01:22 
Man könnte mit Arrays etwas zusammenhacken:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
    static void Main(string[] args)
    {
      var s = "bafoobar";
      switch (s.FindContaining("foobar""bar""foo")) {
        case 0:
          ...
      }
    }

    static int FindContaining(this string s, params string[] values)
    {
      for (int i = 0; i < values.Length; i++)
        if (s.Contains(values[i]))
          return i;

      return -1;
    }

Manche würden wohl eher "Strategy Pattern" in den Raum werfen und darüber eine Abhandlung schreiben, ich belasse es lieber dabei ;) ...

Allerdings hab' ich gerade Langeweile *g*, also noch ein wenig nächtlicher Irrsinn:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
    static void Main(string[] args)
    {
      var s = "bafoobar";
      Switch(s.Contains, new TupleCollection<string, Action> {
          { "foobar", () => Console.WriteLine("whoa") },
          { "foo", () => Console.WriteLine("woha") },
          { "bar", () => Console.WriteLine("woah") }
      });
    }

    static void Switch<T>(Func<T, bool> predicate, TupleCollection<T, Action> cases)
    {
      // ich gehe einmal stillschweigend davon aus, dass irgendein case schon zutreffen
      // wird ;)
      cases.FirstOrDefault(c => predicate(c.First)).Second();
    }

Sieht doch schon viel schöner aus :mrgreen: .
Sollte den Code wirklich jemanden interessieren, dürfte das hier noch nützlich sein:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  public struct Tuple<TFirst, TSecond>
  {
    public TFirst First { get; set; }
    public TSecond Second { get; set; }
  }

  public class TupleCollection<TFirst, TSecond> : Collection<Tuple<TFirst, TSecond>>
  {
    public void Add(TFirst first, TSecond second)
    {
      Add(new Tuple<TFirst, TSecond> {
        First = first,
        Second = second
      }
      );
    }
  }
Fetze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65
Erhaltene Danke: 1



BeitragVerfasst: So 23.03.08 10:50 
Ginge nicht auch:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
switch (true)
{
  case testString.Contains("blah"):
    ...
  case testString.Contains("blub"):
    ...
  case testString.Contains("zong!"):
    ...
}


?
Wäre so das, was mir zuerst eingefallen ist.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 23.03.08 13:10 
user profile iconFetze hat folgendes geschrieben:
Ginge nicht auch:
Frag das doch lieber deinen Compiler oder die Doku als uns :gruebel:² .

[edit]
Und selbst wenn es funktionierte: Da bin ich mit "if ... else if" schneller am Ziel.
[/edit]
ebber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: So 23.03.08 14:39 
Also bei Fetze's kommt der Error "A constant value is expected".

Beim ersten von Khabarakh bekomme ich sowas : "Extension methods must be defined in a non-generic static class" ich denke mal das lässt sich einfach lösen aber ich mache noch nicht so lange was mit C#.
Das 2. von Khabarakh ist mir aus dem gerade genannten Grund glaube ich noch ein wenig zu kompliziert.

Könnte man dann noch etwas, in recht einfacher Weise, einbauen, was die strings nur ungefähr vergleicht? Also so dass es egal ist wenn ein Buchstabe anders ist oder so was in die Richtung?

MfG
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 23.03.08 15:02 
user profile iconebber hat folgendes geschrieben:
Beim ersten von Khabarakh bekomme ich sowas : "Extension methods must be defined in a non-generic static class" ich denke mal das lässt sich einfach lösen aber ich mache noch nicht so lange was mit C#.
Lösche einfach das "this" und rufe die Methode dann ganz normal auf: FindContaining(s, ...).



user profile iconebber hat folgendes geschrieben:
Könnte man dann noch etwas, in recht einfacher Weise, einbauen, was die strings nur ungefähr vergleicht? Also so dass es egal ist wenn ein Buchstabe anders ist oder so was in die Richtung?
Hört sich nach Fuzzy Search an.
ebber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: So 23.03.08 16:20 
Danke. Das funktioniert jetzt.

Falls es jemand interessiert, das habe ich gefunden um strings ungefähr zu vergleichen :

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
            /// <summary>

            /// Compute Levenshtein distance

            /// </summary>

            /// <param name="s">String 1</param>

            /// <param name="t">String 2</param>

            /// <returns>Distance between the two strings.

            /// The larger the number, the bigger the difference.

            /// </returns>

            public int LD(string s, string t)
            {

                int n = s.Length; //length of s

                int m = t.Length; //length of t

                int[,] d = new int[n + 1, m + 1]; // matrix

                int cost; // cost

                // Step 1

                if (n == 0return m;

                if (m == 0return n;

                // Step 2

                for (int i = 0; i <= n; d[i, 0] = i++) ;

                for (int j = 0; j <= m; d[0, j] = j++) ;

                // Step 3

                for (int i = 1; i <= n; i++)
                {

                    //Step 4

                    for (int j = 1; j <= m; j++)
                    {

                        // Step 5

                        cost = (t.Substring(j - 11) == s.Substring(i - 11) ? 0 : 1);

                        // Step 6

                        d[i, j] = System.Math.Min(System.Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1),
                                  d[i - 1, j - 1] + cost);

                    }

                }


                // Step 7


                return d[n, m];

            }