Почему нет Char.Empty, как String.Empty?

Для этого есть причина? Я спрашиваю, потому что, если вам нужно использовать много пустых символов, вы попадаете в ту же ситуацию, что и при использовании большого количества пустых строк.

Редактировать: причина этого использования была такая:

myString.Replace ('c', '')

Поэтому удалите все экземпляры c из myString.

23 ответа

Решение

Там нет такого понятия, как пустой символ. Самое близкое, что вы можете получить, это '\0', Unicode "нулевой" символ. Учитывая, что вы можете встроить это в строковые литералы или очень легко выразить его самостоятельно, зачем вам отдельное поле для него? Также легко спутать "" а также " ""аргументы не применяются для '\0',

Если бы вы могли привести пример, где вы хотели бы использовать его и почему вы думаете, что это будет лучше, это могло бы помочь...

Причина этого использования заключалась в следующем: myString.Replace ('c', '') Так что удалите все экземпляры 'c' из myString.

Чтобы удалить определенный символ из строки, вы можете использовать перегрузку строки:

       myString = myString.Replace ("c", String.Empty);

Ваше заявление

       myString.Replace ('c', '\0')

Не удаляет никаких персонажей. Он просто заменит их на (End-Of-String, EOS) с разными последствиями. Некоторые строковые операции могут останавливаться при обнаружении EOS, но в .NET большинство действий будут обрабатывать его как любой другой char. Лучше избегать '\0' насколько это возможно.

Символ, в отличие от строки, является дискретной вещью с фиксированным размером. Строка действительно контейнер с символами.

Итак, Char.Empty не имеет смысла в этом контексте. Если у вас есть символ, он не пустой.

Там нет такого понятия, как пустой персонаж. Это всегда содержит что-то. Даже '\0' является символом.

Использование Char.MinValue который работает так же, как '\0'. Но будьте осторожны, это не то же самое, что String.Empty,

Вы можете использовать обнуляемые символы.

char? c

Не ответ на ваш вопрос, но для обозначения дефолта char Вы можете использовать только

default(char)

который такой же как char.MinValue который в свою очередь такой же, как \0, Не следует использовать if для чего-то вроде пустой строки.

Если вам не нужна вся строка, вы можете воспользоваться задержкой выполнения:

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

Вы даже можете комбинировать несколько символов...

string veryLongText = "abcdefghijk...";

IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
            .RemoveChar('c')
            .RemoveChar('d')
            .Take(5);

... и будут оцениваться только первые 7 символов:)

РЕДАКТИРОВАТЬ: или, еще лучше:

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

и его использование:

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

ОК, это не особенно элегантно для удаления букв, так как метод.Replace имеет перегрузку, которая принимает строковые параметры. Но это работает для удаления возврата каретки, перевода строки, вкладок и т. Д. В этом примере удаляются символы табуляции:

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

По той же причине нет int.Empty, Контейнеры могут быть пустыми. Скалярные значения не могут быть. Если вы имеете в виду 0 (что не пусто), то используйте '\0', Если ты имеешь ввиду nullзатем используйте null:)

Символ является типом значения, поэтому его значение не может быть нулевым. (Если только он не обернут в контейнер Nullable).

Поскольку он не может быть нулевым, в нем содержится некоторый числовой код, и каждый код сопоставляется какому-либо символу.

Если вы посмотрите документацию по перегрузке Replace(String, String) для String.Replace, вы увидите в разделе примечаний, что если второй аргумент является nullзатем он удалит все экземпляры того, что вы указали. Поэтому, если вы просто используете myString = myString.Replace("c", null); он удалит каждый c в строке.

Не отвечает на ваш первый вопрос - но для конкретной проблемы, которую вы имели, вы можете просто использовать строки вместо символов, верно?:

myString.Replace("c", "")

Есть причина, по которой ты не хотел бы этого делать?

Вы также можете перестроить свою строку символ за символом, исключая символы, от которых вы хотите избавиться.

Вот метод расширения, чтобы сделать это:

    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;
    }

Это не гладко и не модно, но работает хорошо.

Используйте как это:

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

Самый простой способ удалить символ из строки - обрезать его

cl = cl.Trim(' ');

Удаляет все пробелы в строке

вот как мы это делаем: myString.Replace('''.ToString(), "");

Я знаю, что этот файл довольно старый, но недавно я столкнулся с проблемой необходимости многократной замены, чтобы сделать имя файла безопасным. Во-первых, в последней.NET string.Replace функция null является эквивалентом пустого символа. Сказав это, то, что отсутствует в.Net - это простая замена всего, что заменит любой символ в массиве на нужный символ. Пожалуйста, не стесняйтесь ссылаться на код ниже (запускается в LinqPad для тестирования).

// 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));
        }

    }

}

С точки зрения языка C# следующее может не иметь особого смысла. И это не прямой ответ на вопрос. Но мясо птицы - это то, что я делал в одном из моих бизнес-сценариев.

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

null а также white space В моем проекте были разные бизнес-потоки. Вставляя в базу данных, мне нужно вставить empty string в базу данных, если это пробел.

Если вы хотите устранить пустой символ в строке, сработает следующее, просто преобразуйте в любое представление типа данных, которое вы хотите. Спасибо,

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());
            }

        }

    }

Если вы хотите удалить символы, которые удовлетворяют определенному условию, вы можете использовать это:

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

(Это оставит только заглавные символы в строке.)

Другими словами, вы можете преобразовать строку в IEnumerable<char>внесите в него изменения, а затем преобразуйте его обратно в строку, как показано выше.

Опять же, это позволяет не только удалять определенный символ из-за лямбда-выражения, но вы можете сделать это, если измените лямбда-выражение следующим образом: c => c != 't',

Как насчет BOM, магического персонажа, который Microsoft добавляет для запуска файлов (по крайней мере, XML)?

public static string QuitEscChars(this string s) 
{
    return s.Replace(((char)27).ToString(), "");
}

Использование

myString.Replace ("c", "")
Другие вопросы по тегам