Autor |
Beitrag |
ebber
      
Beiträge: 239
Erhaltene Danke: 1
Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
|
Verfasst: Fr 21.03.08 19:43
Hallo
gibt es eine Möglichkeit switch und string.Contains zu verbinden ?
Also sowas wie
C#-Quelltext 1: 2: 3: 4:
| switch (string.Contains) { case "xyz": dosth(); } |
MfG
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Sa 22.03.08 01:22
Man könnte mit Arrays etwas zusammenhacken:
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:
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) { cases.FirstOrDefault(c => predicate(c.First)).Second(); } |
Sieht doch schon viel schöner aus  .
Sollte den Code wirklich jemanden interessieren, dürfte das hier noch nützlich sein:
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
      
Beiträge: 65
Erhaltene Danke: 1
|
Verfasst: So 23.03.08 10:50
Ginge nicht auch:
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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 23.03.08 13:10
Fetze hat folgendes geschrieben: | Ginge nicht auch: |
Frag das doch lieber deinen Compiler oder die Doku als uns  ² .
[edit]
Und selbst wenn es funktionierte: Da bin ich mit "if ... else if" schneller am Ziel.
[/edit]
|
|
ebber 
      
Beiträge: 239
Erhaltene Danke: 1
Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 23.03.08 15:02
ebber 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, ...).
ebber 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 
      
Beiträge: 239
Erhaltene Danke: 1
Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
|
Verfasst: So 23.03.08 16:20
Danke. Das funktioniert jetzt.
Falls es jemand interessiert, das habe ich gefunden um strings ungefähr zu vergleichen :
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:
| public int LD(string s, string t) {
int n = s.Length; int m = t.Length; int[,] d = new int[n + 1, m + 1]; int cost; if (n == 0) return m;
if (m == 0) return n;
for (int i = 0; i <= n; d[i, 0] = i++) ;
for (int j = 0; j <= m; d[0, j] = j++) ;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cost = (t.Substring(j - 1, 1) == s.Substring(i - 1, 1) ? 0 : 1);
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);
}
}
return d[n, m];
} |
|
|
|