【问题标题】:Why is there no Char.Empty like String.Empty?为什么没有像 String.Empty 这样的 Char.Empty?
【发布时间】:2011-04-09 21:19:43
【问题描述】:

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

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

myString.Replace ('c', '')

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

【问题讨论】:

  • 是的,我用这个词是因为没有更好的词。即使用 String.Empty 而不是“”的推荐方式。
  • 如果您担心有时会意外输入错误的 '',为什么不按照RemoveAll(this string s, params char[] toRemove) 的方式简单地将功能包装在扩展方法中?意图将被清楚地传达,您不会冒任何错误输入的风险。
  • @Henk - 我使用 string.Empty 的唯一原因是因为我发现 Empty 提供的 null 对象比空引号更能表达意图。空引号可能是由合并问题或错误的想法引起的,也可能是该代码的实际意图,而 Empty 明确告诉我开发人员打算让该字符串没有数据。
  • "" 和 string.Empty 是有区别的。并不是说真的有人在乎,而是 "" 创建了一个对象,而 string.Empty 使用了一个已经创建的对象。但同样,它是如此之小,只有在特殊情况下才会有所不同
  • @marcelo-ferrazm,关于 "" 创建一个对象:不,它没有。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      default(char)
      

      char.MinValue 相同,而\0 又与\0 相同。但是,不应该将它用于空字符串之类的东西。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

            • null 是不可能的,因为 char 是一个 ValueType。你必须使用char?能够将 null 分配给它。
            • 你应该让它可以为空。看我的回答
            【解决方案7】:
            public static string QuitEscChars(this string s) 
            {
                return s.Replace(((char)27).ToString(), "");
            }
            

            【讨论】:

            • 您好!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
            【解决方案8】:

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

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

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

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

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

            【讨论】:

              【解决方案9】:

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

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

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

              你的陈述

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

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

              【讨论】:

              • 我希望得到更多的投票,因为这是实际的解决方案。
              • 多么新颖,一个问题的解决方案!
              • @OrenMazor,不,不是。这个答案甚至没有尝试回答这个问题。问题是“为什么没有像 String.Empty 这样的 Char.Empty?”
              • @DavidMurdoch - 是的,问题并不总是看起来像这样。
              【解决方案10】:

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

              cl = cl.Trim(' ');

              删除字符串中的所有空格

              【讨论】:

              • 如果想要使用 use .Replace('c', ' ') 并删除其他空格的缺点,这很有帮助。但它比给出的许多其他答案更有帮助。
              • 不,这是错误的! Trim 只删除不在中间的字符串开头和结尾的字符
              【解决方案11】:

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

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

              【讨论】:

              • 不是 \0 '字节数组的结尾'-字符吗?还是我对其他事情感到困惑?
              • @Bertvan:为什么byte 数组的末尾会有一个character?不过,它用于“空终止”字符串,是的。
              • Char.MinValue 优于 '\0'
              • @Aliostad:出于兴趣,如果Int32.Zero 有类似的字段,您会使用它而不是文字 0 吗?如果不是,这里有什么区别?
              • @Adam, @Jon -- bell 的代码是什么?或者退格更好,想想想想......或者也许不是认为写 Char.Backspace 更好?另一个原因——你说最好为终止符写“0”,而不是说 Char.Terminator,但事实并非如此——很容易打错字(完全编译,见上文),但试着写字符终止符。我有足够的理由避免使用不可检查的原始值(太空任务因此类愚蠢的拼写错误而失败)。
              【解决方案12】:

              使用

              myString.Replace ("c", "")
              

              【讨论】:

              • 这是 Ian Grainger 2013 年回答的副本。
              【解决方案13】:

              你也可以逐个字符地重建你的字符串,不包括你想去掉的字符。

              这是一个扩展方法:

                  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"
              

              【讨论】:

              • result 使用StringBuilder。为什么不包装return s.Replace(charsToRemove,"");
              【解决方案14】:

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

              【讨论】:

                【解决方案15】:

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

                myString.Replace("c", "")
                

                您有不想这样做的原因吗?

                【讨论】:

                  【解决方案16】:

                  使用Char.MinValue,其作用与“\0”相同。但要注意它和String.Empty不一样。

                  【讨论】:

                  • 谢谢,以前没见过。你知道它在 myString.Replace('c', Char.MinValue) 中是否有效吗?我应该试一试。
                  【解决方案17】:
                  myString = myString.Replace('c'.ToString(), "");
                  

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

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

                  【讨论】:

                    【解决方案18】:

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

                    【讨论】:

                    • 这里维基百科上的措辞很不幸;在这种情况下,BOM 不是一个字符。你的问题到底是什么? :)
                    • @onemach,那么,myString.Replace ('c', '')是否可以通过myString.Replace ('c', UTF_BOM)实现。然后我会说答案是“如何...”。
                    【解决方案19】:

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

                    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"
                    

                    【讨论】:

                    • @Joan:谢谢……即使是“天才”也有点夸张:P(我不知道它在删除字符会变成一个大数组时的表现……)
                    • 昨天我忘记了:注意你是如何使用结果变量“firstFiveCharsWithoutCsAndDs”的。如果您不想将其传递给另一个“yield”方法(如 LINQ 的方法),请在“Take(5)”之后立即调用“.ToArray()”......否则,“RemoveChars + Take”每次以“传统”方式访问变量时都会执行链(例如,每次在其上调用“Count()”,或者在没有“yield return”的情况下在 foreach 中遍历它时)
                    • +1 好主意。但这不能像基本方法那样可维护或高效:)
                    • @nawfal 效率方面你是对的,但我认为 myString.Except("c") 比 myString.Replace('c', '') 更具声明性:P(和它扩展性很好:myString.Except("aeiou"))
                    【解决方案20】:

                    您可以使用nullable 字符。

                    char? c
                    

                    【讨论】:

                    • 这允许''?还是只是空?
                    • 在你的情况下,你可以这样做:myString.Replace("c", (c == null ? "" : c.ToString()))
                    【解决方案21】:

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

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

                    【讨论】:

                      【解决方案22】:

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

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

                      【讨论】:

                      • 完全正确。询问容器是否为空是有意义的。要求 int 或 float 或 char 为空是没有意义的。
                      • @Joe:如果字符串是(非空)字符的集合,那么字符串怎么可能是空的呢?可能是愚蠢的,对不起......
                      • 因为字符串不是单个对象,而是集合。想想一桶石头。我不能有一块空的石头。但我可以有一个空桶。
                      • 我将其表述为“char 是原始的值类型,而字符串是非原始的引用类型”。
                      • 这才是真正的答案。
                      【解决方案23】:

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

                      【讨论】:

                        猜你喜欢
                        • 2011-11-25
                        • 2011-03-09
                        • 2011-03-27
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多