Warum gibt es kein Char.Empty wie String.Empty?

Gibt es einen Grund dafür? Ich frage, weil, wenn Sie viele leere Zeichen verwenden mussten, Sie in die gleiche Situation geraten, als wenn Sie viele leere Zeichenfolgen verwenden würden.

Edit: Der Grund für diese Verwendung war dies:

myString.Replace ('c', '') 

Entfernen Sie alle Instanzen von “c” aus myString.

Es gibt keine leeren Chars. Der nächstgelegene Wert ist '\0' , das Unicode-Zeichen “null”. Angesichts der Tatsache, dass Sie das in String-Literale einbetten können oder es sehr einfach selbst express können, warum sollten Sie ein separates Feld dafür haben? Gleichermaßen gelten die Argumente “es ist leicht zu verwechseln "" und " " nicht für '\0' .

Wenn Sie ein Beispiel geben könnten, wo Sie es verwenden möchten und warum Sie denken, dass es besser wäre, könnte das helfen …

Ein Zeichen ist im Gegensatz zu einer Zeichenfolge eine diskrete Sache mit einer festen Größe. Eine Zeichenfolge ist wirklich ein Container von Zeichen.

Also macht Char.Empty in diesem Zusammenhang keinen Sinn. Wenn Sie ein Zeichen haben, ist es nicht leer.

Es gibt kein leeres Zeichen. Es enthält immer etwas . Sogar ‘\ 0’ ist ein Zeichen.

Verwenden Sie Char.MinValue das Char.MinValue funktioniert wie ‘\ 0’. Aber Vorsicht, es ist nicht dasselbe wie String.Empty .

Sie könnten nullbare Zeichen verwenden.

 char? c 

Wenn Sie nicht die gesamte Zeichenfolge benötigen, können Sie die verzögerte Ausführung nutzen:

 public static class StringExtensions { public static IEnumerable RemoveChar(this IEnumerable originalString, char removingChar) { return originalString.Where(@char => @char != removingChar); } } 

Sie können sogar mehrere Charaktere kombinieren …

 string veryLongText = "abcdefghijk..."; IEnumerable firstFiveCharsWithoutCsAndDs = veryLongText .RemoveChar('c') .RemoveChar('d') .Take(5); 

… und nur die ersten 7 Zeichen werden ausgewertet 🙂

EDIT: oder noch besser:

 public static class StringExtensions { public static IEnumerable RemoveChars(this IEnumerable originalString, params char[] removingChars) { return originalString.Except(removingChars); } } 

und seine Verwendung:

  var veryLongText = "abcdefghijk..."; IEnumerable firstFiveCharsWithoutCsAndDs = veryLongText .RemoveChars('c', 'd') .Take(5) .ToArray(); //to prevent multiple execution of "RemoveChars" 

Aus demselben Grund gibt es kein int.Empty . Container können leer sein. Skalare Werte können nicht sein. Wenn du 0 meinst (was nicht leer ist), dann benutze '\0' . Wenn Sie null meinen, dann verwenden Sie null 🙂

Ein Zeichen ist ein Werttyp, daher darf der Wert nicht null sein. (Es sei denn, es ist in einen Nullable-Container eingeschlossen).

Da es nicht null sein kann, enthält es einen numerischen Code und jeder Code ist einem bestimmten Zeichen zugeordnet.

 myString = myString.Replace('c'.ToString(), ""); 

OK, das ist nicht besonders elegant zum Entfernen von Buchstaben, da die .Replace-Methode eine Überladung hat, die String-Parameter akzeptiert. Dies funktioniert jedoch zum Entfernen von Wagenrücklauf, Zeilenvorschub, Tabulatoren usw. In diesem Beispiel werden Tabulatorzeichen entfernt:

 myString = myString.Replace('\t'.ToString(), ""); 

Keine Antwort auf Ihre Frage, sondern ein Standardzeichen, das Sie nur verwenden können

 default(char) 

Das ist dasselbe wie char.MinValue das wiederum mit \0 identisch ist. Man sollte aber nicht für etwas wie eine leere Zeichenfolge verwenden.

Beantworten Sie nicht Ihre erste Frage – aber für das spezifische Problem, das Sie hatten, können Sie nur Zeichenfolgen anstelle von Zeichen verwenden, oder?

 myString.Replace("c", "") 

Gibt es einen Grund, warum du das nicht willst?

Sie können die Zeichenfolge auch Zeichen für Zeichen neu erstellen und dabei die Zeichen ausschließen, die Sie entfernen möchten.

Hier ist eine Erweiterungsmethode, um dies zu tun:

  static public string RemoveAny(this string s, string charsToRemove) { var result = ""; foreach (var c in s) if (charsToRemove.Contains(c)) continue; else result += c; return result; } 

Es ist nicht glatt oder schick, aber es funktioniert gut.

Verwenden Sie so:

 string newString = "My_String".RemoveAny("_"); //yields "MyString" 

Die einfachste Möglichkeit, ein Zeichen aus der Zeichenkette zu entfernen, besteht darin, es zu trimmen

cl = cl.Trim(' ');

Entfernt alle Leerzeichen in einer Zeichenfolge

Was ist mit BOM , dem magischen Zeichen, das Microsoft zum Start von Dateien (zumindest XML) hinzufügt?

Wenn Sie das leere Zeichen in der Zeichenkette eliminieren möchten, dann können Sie einfach in jede gewünschte Datentypdarstellung konvertieren. Vielen Dank,

 private void button1_Click(object sender, EventArgs e) { Int32 i; String name; Int32[] array_number = new int[100]; name = "1 3 5 17 8 9 6"; name = name.Replace(' ', 'x'); char[] chr = name.ToCharArray(); for (i = 0; i < name.Length; i++) { if ((chr[i] != 'x')) { array_number[i] = Convert.ToInt32(chr[i].ToString()); MessageBox.Show(array_number[i].ToString()); } } } 

In Bezug auf C # -Sprache mag Folgendes nicht viel Sinn machen. Und das ist keine direkte Antwort auf die Frage. Aber ich habe in einem meiner Geschäftsszenarios gebuddelt

  char? myCharFromUI = Convert.ToChar(" "); string myStringForDatabaseInsert = myCharFromUI.ToString().Trim(); if (String.IsNullOrEmpty(myStringForDatabaseInsert.Trim())) { Console.Write("Success"); } 

Der null und der white space hatten in meinem Projekt unterschiedliche Geschäftsabläufe. Beim Einfügen in die database muss eine empty string in die database eingefügt werden, wenn es sich um Leerraum handelt.

Ich weiß, dass das ziemlich alt ist, aber ich habe kürzlich ein Problem mit mehreren Ersetzungen gefunden, um einen Dateinamen sicher zu machen. Erstens, in der neuesten .NET-String.Replace-function null ist das Äquivalent zu leeren Zeichen. Nichtsdestotrotz fehlt in .Net ein einfacher Ersatz für alle Zeichen in einem Array mit dem gewünschten Zeichen. Bitte zögern Sie nicht, den folgenden Code zu referenzieren (wird in LinqPad zum Testen ausgeführt).

 // LinqPad .ReplaceAll and SafeFileName void Main() { ("a:B:C").Replace(":", "_").Dump(); // can only replace 1 character for one character => a_B_C ("a:B:C").Replace(":", null).Dump(); // null replaces with empty => aBC ("a:B*C").Replace(":", null).Replace("*",null).Dump(); // Have to chain for multiples // Need a ReplaceAll, so I don't have to chain calls ("abc/123.txt").SafeFileName().Dump(); ("abc/1/2/3.txt").SafeFileName().Dump(); ("a:bc/1/2/3.txt").SafeFileName().Dump(); ("a:bc/1/2/3.txt").SafeFileName('_').Dump(); //("abc/123").SafeFileName(':').Dump(); // Throws exception as expected } static class StringExtensions { public static string SafeFileName(this string value, char? replacement = null) { return value.ReplaceAll(replacement, ':','*','?','"','< ','>', '|', '/', '\\'); } public static string ReplaceAll(this string value, char? replacement, params char[] charsToGo){ if(replacement.HasValue == false){ return string.Join("", value.AsEnumerable().Where(x => charsToGo.Contains(x) == false)); } else{ if(charsToGo.Contains(replacement.Value)){ throw new ArgumentException(string.Format("Replacement '{0}' is invalid. ", replacement), "replacement"); } return string.Join("", value.AsEnumerable().Select(x => charsToGo.Contains(x) == true ? replacement : x)); } } } 

benutzen

 myString.Replace ("c", "") 

Wenn Sie Zeichen entfernen möchten, die eine bestimmte Bedingung erfüllen, können Sie Folgendes verwenden:

 string s = "SoMEthInG"; s = new string(s.ToCharArray().Where(c => char.IsUpper(c)).ToArray()); 

(Dadurch bleiben nur die Großbuchstaben in der Zeichenfolge.)

Mit anderen Worten, Sie können die Zeichenfolge in ein IEnumerable konvertieren, Änderungen daran vornehmen und sie dann wie oben gezeigt wieder in eine Zeichenfolge konvertieren.

Dies wiederum ermöglicht es, ein bestimmtes Zeichen nicht nur wegen des Lambda-Ausdrucks zu entfernen, obwohl Sie dies tun können, wenn Sie den Lambda-Ausdruck wie folgt ändern: c => c != 't' .