Почему там нет Char.Пусто, как струна.Пусто?


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

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

myString.Replace ('c', '')

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

19 207

19 ответов:

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

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

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

Так, Чар.Пустые самом деле не имеет смысла в этом контексте. Если у вас есть символ, он не пуст.

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

вы могли бы использовать nullable chars.

char? c

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

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

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"

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

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

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

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

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

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

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

default(char)

что же char.MinValue что, в свою очередь, то же самое, что и . Однако не следует использовать if для чего-то вроде пустой строки.

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

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

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

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

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

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

        }

    }

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

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

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

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

    }

}

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

myString.Replace ("c", "")

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

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

(это оставит только прописные символы в строке.)

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

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