关于c#:为什么没有像String.Empty这样的Char.Empty?

Why is there no Char.Empty like String.Empty?

有什么原因吗?我问是因为如果你需要使用大量的空字符,那么当你使用大量的空字符串时,你会遇到同样的情况。

编辑:此用法的原因是:

1
myString.Replace ('c', '')

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


没有空字符这样的东西。最接近的是'\0',即unicode的"空"字符。既然您可以将它嵌入到字符串文本中,或者非常容易地单独表示它,那么为什么您要为它指定一个单独的字段呢?同样,"很容易混淆"""""的论点不适用于'\0'

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


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

所以,char.empty在这种情况下并不真正有意义。如果你有一个字符,它不是空的。


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


使用与"0"工作相同的Char.MinValue。但要小心,它与String.Empty不同。


可以使用可以为空的字符。

1
char? c


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

1
2
3
4
5
6
7
public static class StringExtensions
{
    public static IEnumerable<char> RemoveChar(this IEnumerable<char> originalString, char removingChar)
    {
        return originalString.Where(@char => @char != removingChar);
    }
}

您甚至可以组合多个字符…

1
2
3
4
5
6
string veryLongText ="abcdefghijk...";

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

…只计算前7个字符:)

编辑:或者,更好的是:

1
2
3
4
5
6
7
8
public static class StringExtensions
{
    public static IEnumerable<char> RemoveChars(this IEnumerable<char> originalString,
        params char[] removingChars)
    {
        return originalString.Except(removingChars);
    }
}

及其用途:

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


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


char是值类型,因此其值不能为空。(除非包装在可空容器中)。

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


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

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

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

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

1
default(char)

Char.MinValue相同,与\0相同。但是,对于类似空字符串的东西,不应该使用if。


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

1
myString.Replace("c","")

你不想那样做是有原因的吗?


您还可以逐个字符重新生成字符串,不包括要删除的字符。

下面是一个扩展方法:

1
2
3
4
5
6
7
8
9
10
11
    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;
    }

它既不光滑也不花哨,但效果很好。

这样使用:

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


如果您想省去字符串中的空字符,下面的内容就可以了,只需转换为您想要的任何数据类型表示。谢谢,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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语言而言,以下内容可能没有多大意义。这不是问题的直接答案。但在我的一个商业场景中,我是这么做的

1
2
3
4
5
6
        char? myCharFromUI = Convert.ToChar("");
        string myStringForDatabaseInsert = myCharFromUI.ToString().Trim();
        if (String.IsNullOrEmpty(myStringForDatabaseInsert.Trim()))
        {
            Console.Write("Success");
        }

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


我知道这个很旧,但是最近我遇到了一个问题,那就是必须进行多次替换才能保证文件名的安全。首先,在最新的.NET字符串中。replace函数null等效于空字符。尽管如此,.NET所缺少的是一个简单的"全部替换",它将用所需的字符替换数组中的任何字符。请随时参考以下代码(在linqpad中运行以进行测试)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 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));
        }

    }

}

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

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

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

换句话说,您可以将字符串转换为IEnumerable,对其进行更改,然后将其转换回如上所示的字符串。

同样,这不仅使您能够因为lambda表达式而删除特定的字符,而且如果您像这样更改lambda表达式:c => c != 't',您也可以这样做。


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


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

cl = cl.Trim(' ');

删除字符串中的所有空格


使用

1
myString.Replace ("c","")