为什么没有夏尔。像字符串一样空。空?

这有什么原因吗?我问这个问题是因为如果你需要使用大量的空字符,那么你就会陷入与你使用大量空字符串时相同的情况。

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

myString.Replace ('c', '')

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

310714 次浏览

没有空char这样的东西。你能得到的最接近的是'\0', Unicode的“null”字符。既然你可以将它嵌入到字符串字面量中,或者很容易地表达它,为什么要为它设置一个单独的字段呢?同样,“很容易混淆""" "”参数不适用于'\0'

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

没有空字符这种东西。它总是包含某物。甚至“\0”也是一个字符。

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

所以,Char。在这种情况下,空是没有意义的。如果你有一个char,它就不是空的。

使用Char.MinValue,它的工作原理与'\0'相同。但要注意它与String.Empty不同。

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

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

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

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

char? c
这种用法的原因是:myString.Replace ('c', '') 因此,从myString中删除'c'的所有实例

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

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

你的语句

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

不会删除任何字符。它只会将它们替换为'\0' (End-Of-String, EOS),结果不同。一些字符串操作可能会在遇到EOS时停止,但在. net中,大多数操作将像对待其他char一样对待它。最好尽量避免'\0'

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

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"

那么物料清单呢?微软添加到文件开头的神奇字符(至少是XML)?

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

好吧,这对于删除字母来说不是特别优雅,因为. replace方法有一个接受字符串参数的重载。但这适用于删除回车符、换行符、制表符等。下面的例子删除了制表符:

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

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

myString.Replace("c", "")

你为什么不想这么做?

不是回答你的问题,但表示默认的char,你可以使用just

default(char)

它与char.MinValue相同,而char.MinValue又与\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());
}
}
}

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

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

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

我知道这个很老了,但我最近遇到了一个问题,必须进行多次替换才能使文件名安全。首先,在最新的。net字符串中。替换函数null相当于空字符。话虽如此,. net中缺少的是一个简单的replace all,它将数组中的任何字符替换为所需的字符。请随意参考下面的代码(在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));
}


}


}

还可以逐字符重新构建字符串,排除想要删除的字符。

下面是一个扩展方法:

    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"

使用

myString.Replace ("c", "")

如果你想删除满足特定条件的字符,你可以使用这个:

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

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

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

同样,这不仅允许因为lambda表达式而删除特定的字符,尽管如果您像这样更改lambda表达式,则可以这样做:c => c != 't'

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

cl = cl.Trim(' ');

删除字符串中的所有空格

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

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

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

.