297

是否有一个原因?我问是因为如果您需要使用大量空字符,那么您会遇到与使用大量空字符串时相同的情况。

编辑:这种用法的原因是这样的:

myString.Replace ('c', '')

所以从 myString 中删除所有 'c' 的实例。

4

23 回答 23

302

没有空字符之类的东西。您可以获得的最接近的是'\0'Unicode“空”字符。鉴于您可以将它嵌入到字符串文字中或非常容易地单独表达它,为什么您需要一个单独的字段呢?""同样,“容易混淆" "”的论点也不适用'\0'

如果你能举例说明你想在哪里使用它以及为什么你认为它会更好,那可能会有所帮助......

于 2010-09-08T17:45:56.567 回答
195

这种用法的原因是:所以从 myStringmyString.Replace ('c', '') 中删除所有实例。'c'

要从字符串中删除特定字符,您可以使用字符串重载:

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

你的陈述

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

不会删除任何字符。它只会用'\0'(End-Of-String, EOS) 替换它们,并产生不同的后果。遇到 EOS 时,某些字符串操作可能会停止,但在 .NET 中,大多数操作会将其视为任何其他字符。最好尽量避免'\0'

于 2010-09-08T18:07:47.023 回答
96

与字符串不同,char 是具有固定大小的离散事物。字符串实际上是字符的容器。

因此, Char.Empty 在这种情况下并没有真正意义。如果你有一个字符,它不是空的。

于 2010-09-08T17:46:53.943 回答
36

没有空字符这样的东西。它总是包含一些东西。甚至 '\0' 也是一个字符。

于 2010-09-08T17:46:37.137 回答
33

使用Char.MinValue与 '\0' 相同的工作方式。但要小心它是不一样的String.Empty

于 2010-09-08T17:48:15.127 回答
19

您可以使用可为的字符。

char? c
于 2010-09-08T17:54:25.333 回答
13

如果您不需要整个字符串,则可以利用延迟执行:

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"
于 2010-09-08T19:17:16.243 回答
12
myString = myString.Replace('c'.ToString(), "");

好的,这对于删除字母并不是特别优雅,因为 .Replace 方法有一个接受字符串参数的重载。但这适用于删除回车符、换行符、制表符等。此示例删除制表符:

myString = myString.Replace('\t'.ToString(), "");
于 2011-05-21T00:12:39.503 回答
9

不是您问题的答案,而是表示char您可以使用的默认值

default(char)

这与char.MinValuewhich 又与 相同\0。但是,不应将其用于空字符串之类的东西。

于 2013-02-04T09:53:43.347 回答
7

同样的原因没有int.Empty. 容器可以是空的,标量值不能。如果您的意思是 0(不为空),则使用'\0'. 如果你的意思是null,那么使用null:)

于 2010-09-08T17:51:36.960 回答
6

char 是一种值类型,因此它的值不能为空。(除非它被包裹在 Nullable 容器中)。

由于它不能为空,因此 in 包含一些数字代码,并且每个代码都映射到某个字符。

于 2010-09-08T17:53:41.670 回答
3

不回答您的第一个问题-但是对于您遇到的特定问题,您可以只使用字符串而不是字符,对吗?:

myString.Replace("c", "")

你有理由不想这样做吗?

于 2013-01-29T16:24:04.203 回答
3

如果您查看有关 String.Replace 的 Replace(String, String) 重载的文档,您可以在备注部分看到,如果第二个参数是 anull那么它将删除您指定的所有实例。因此,如果您只是使用myString = myString.Replace("c", null);它将删除c字符串中的每个。

于 2021-07-23T07:30:15.183 回答
2

您还可以逐个字符地重建字符串,不包括要删除的字符。

这是执行此操作的扩展方法:

    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"
于 2015-09-02T14:12:21.103 回答
1

我知道这个已经很老了,但我最近遇到了一个问题,必须进行多次替换才能使文件名安全。首先,在最新的.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));
        }

    }

}
于 2015-02-27T15:18:16.350 回答
1

如果要消除字符串中的空字符,以下将起作用。只需转换为您想要的任何数据类型表示。

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());
        }
    }
}
于 2013-06-26T13:48:39.790 回答
1

在 C# 语言方面,以下可能没有多大意义。这不是问题的直接答案。但以下是我在我的一个业务场景中所做的。

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

在我的项目nullwhite space有不同的业务流程。插入数据库时​​,empty string如果是空白,我需要插入数据库。

于 2013-09-05T10:16:14.043 回答
1

如果要删除满足特定条件的字符,可以使用:

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

(这将只留下字符串中的大写字符。)

换句话说,您可以将字符串“使用”为IEnumerable<char>,对其进行更改,然后将其转换回字符串,如上所示。

同样,这不仅可以删除由于 lambda 表达式而导致的特定字符,但如果您像这样更改 lambda 表达式,您也可以这样做c => c != 't'

于 2016-06-26T16:49:37.560 回答
0

BOM怎么样,微软添加到文件开头的神奇字符(至少是 XML)?

于 2010-09-10T05:02:19.300 回答
0
public static string QuitEscChars(this string s) 
{
    return s.Replace(((char)27).ToString(), "");
}
于 2020-07-30T12:08:31.657 回答
0

我们是这样做的: myString.Replace ('''.ToString(), "");

于 2022-01-23T17:39:13.647 回答
-3

利用

myString.Replace ("c", "")
于 2016-01-26T06:30:45.900 回答
-4

从字符串中删除字符的最简单方法是修剪它

cl = cl.Trim(' ');

删除字符串中的所有空格

于 2017-09-04T11:07:06.880 回答