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

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

Изменить: причиной этого было следующее:

myString.Replace ('c', '')

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

Ответ 1

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

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

Ответ 2

Ваше выражение

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

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

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

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

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

Ответ 3

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

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

Ответ 4

Нет такой вещи, как пустой символ. Он всегда содержит что-то. Даже "\ 0" является символом.

Ответ 5

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

Ответ 6

Вы можете использовать nullable chars.

char? c

Ответ 7

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

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 символов:)

EDIT: или, что еще лучше:

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"

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

default(char)

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

Ответ 11

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

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

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

Ответ 12

использовать

myString.Replace ("c", "")

Ответ 13

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

Ответ 14

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

myString.Replace("c", "")

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

Ответ 15

если вы хотите эллимировать пустую строку char в следующей последовательности, выполните следующие действия: просто конвертируйте в любое представление типа данных, которое вы хотите. спасибо,

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

        }

    }

Ответ 16

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

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

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

Ответ 17

Я знаю, что этот довольно старый, но недавно я столкнулся с проблемой, когда мне пришлось сделать несколько замен, чтобы сделать имя файла безопасным. Во-первых, в последней версии .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));
        }

    }

}

Ответ 18

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

Здесь используется метод расширения:

    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"

Ответ 19

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

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

(Это оставит только строчные буквы в строке.)

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

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

Ответ 20

Самый простой способ обложки удалить символ из строки - это Trim it

cl = cl.Trim(' ');

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