为什么没有像String.Empty这样的Char.Empty?

时间:2010-09-08 17:44:53

标签: c# .net string char base-class-library

这有什么理由吗?我问,因为如果你需要使用大量空字符,那么你会遇到与使用大量空字符串时相同的情况。

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

myString.Replace ('c', '')

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

21 个答案:

答案 0 :(得分:242)

没有空的char。您可以得到的最接近的是'\0',即Unicode“null”字符。鉴于您可以将其嵌入到字符串文字中或者非常容易地表达它,为什么您需要一个单独的字段呢?同样,“很容易混淆""" "”参数不适用于'\0'

如果您可以举例说明您想要使用它的原因以及您认为它会更好的原因,那可能会有所帮助......

答案 1 :(得分:75)

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

所以,Char.Empty在这种背景下并没有真正意义。如果你有一个char,它就不是空的。

答案 2 :(得分:29)

没有空角色这样的东西。它总是包含某些东西。即使'\ 0'也是一个角色。

答案 3 :(得分:23)

使用与{\ 0'相同的Char.MinValue。但请注意,它与String.Empty不一样。

答案 4 :(得分:19)

您可以使用nullable字符。

char? c

答案 5 :(得分:10)

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

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"

答案 6 :(得分:5)

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

答案 7 :(得分:5)

char是值类型,因此其值不能为null。 (除非它被包装在Nullable容器中)。

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

答案 8 :(得分:4)

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

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

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

答案 9 :(得分:3)

不是您问题的答案,而是表示默认char,您只能使用

default(char)

char.MinValue相同,\0与{{1}}相同。如果对于像空字符串这样的东西,就不应该使用它。

答案 10 :(得分:2)

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

答案 11 :(得分:1)

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

myString.Replace("c", "")

有理由你不想这样做吗?

答案 12 :(得分:1)

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

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

    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"

答案 13 :(得分:0)

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

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

        }

    }

答案 14 :(得分:0)

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

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

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

答案 15 :(得分:0)

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

    }

}

答案 16 :(得分:0)

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

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

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

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

同样,这使得不仅可以删除特定的char,因为lambda表达式,但是如果你改变lambda表达式,你可以这样做:c => c != 't'

答案 17 :(得分:0)

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

答案 18 :(得分:0)

BOM,微软为文件开头添加的神奇角色(至少是XML)怎么样?

答案 19 :(得分:-2)

使用

myString.Replace ("c", "")

答案 20 :(得分:-2)

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

cl = cl.Trim(' ');

删除字符串中的所有空格