【问题标题】:How can I split and trim a string into parts all on one line?如何在一行上将字符串拆分和修剪成多个部分?
【发布时间】:2010-12-16 05:52:33
【问题描述】:

我想分割这条线:

string line = "First Name ; string ; firstName";

到他们修剪版本的数组中:

"First Name"
"string"
"firstName"

我怎样才能在一行中完成所有这些操作?以下给我一个错误“无法转换类型 void”:

List<string> parts = line.Split(';').ToList().ForEach(p => p.Trim()); 

【问题讨论】:

  • 返回错误是因为ForEach 作用于IEnumerable 的当前实例并返回void

标签: c# .net split trim


【解决方案1】:

试试

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

仅供参考,Foreach 方法采用 Action(采用 T 并返回 void)作为参数,而您的 lambda 以字符串形式返回字符串。Trim 返回字符串

Foreach 扩展方法旨在修改集合中对象的状态。由于字符串是不可变的,这将没有效果

希望对你有帮助;o)

塞德里克

【讨论】:

  • 注意:ForEach 不是扩展方法。
  • Linq 中的最佳解决方案!
  • 如果没有值返回null怎么办?
  • 如果 line 为 null 那么你会得到一个异常。如果行不包含';'您将有一个列表,其中包含一个与修剪线相对应的字符串
【解决方案2】:

ForEach 方法不返回任何内容,因此您不能将其分配给变量。

改用Select 扩展方法:

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

【讨论】:

    【解决方案3】:

    因为 p.Trim() 返回一个新字符串。

    你需要使用:

    List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();
    

    【讨论】:

      【解决方案4】:

      这是一个扩展方法...

          public static string[] SplitAndTrim(this string text, char separator)
          {
              if (string.IsNullOrWhiteSpace(text))
              {
                  return null;
              }
      
              return text.Split(separator).Select(t => t.Trim()).ToArray();
          }
      

      【讨论】:

        【解决方案5】:

        或者试试这个:

        string[] parts = Regex.Split(line, "\\s*;\\s*");
        

        【讨论】:

        • 这是个好主意,但是,我相信它会遗漏字符串末尾的任何尾随空格,对吗?
        【解决方案6】:

        尝试使用正则表达式:

        List<string> parts = System.Text.RegularExpressions.Regex.Split(line, @"\s*;\s*").ToList();
        

        【讨论】:

          【解决方案7】:

          .net 5 之后,解决方法很简单:

          List<string> parts = line.Split(';', StringSplitOptions.TrimEntries);
          

          【讨论】:

          【解决方案8】:

          Split 返回 string[] 类型。写一个扩展方法:

          public static string[] SplitTrim(this string data, char arg)
          {
              string[] ar = data.Split(arg);
              for (int i = 0; i < ar.Length; i++)
              {
                  ar[i] = ar[i].Trim();
              }
              return ar;
          }
          

          我喜欢你的解决方案,所以我决定添加它并使它更有用。

          public static string[] SplitAndTrim(this string data, char[] arg)
          {
              return SplitAndTrim(data, arg, StringSplitOptions.None);
          }
          
          public static string[] SplitAndTrim(this string data, char[] arg, 
          StringSplitOptions sso)
          {
              string[] ar = data.Split(arg, sso);
              for (int i = 0; i < ar.Length; i++)
                  ar[i] = ar[i].Trim();
              return ar;
          }
          

          【讨论】:

            【解决方案9】:

            使用正则表达式

            string a="bob, jon,man; francis;luke; lee bob";
            			String pattern = @"[,;\s]";
                        String[] elements = Regex.Split(a, pattern).Where(item=>!String.IsNullOrEmpty(item)).Select(item=>item.Trim()).ToArray();;			
                        foreach (string item in elements){
                            Console.WriteLine(item.Trim());

            结果:

            鲍勃

            乔恩

            男人

            弗朗西斯

            卢克

            鲍勃

            解释模式 [,;\s]:匹配出现的 , ;或空格字符

            【讨论】:

              猜你喜欢
              • 2018-02-06
              • 1970-01-01
              • 2012-08-25
              • 1970-01-01
              • 1970-01-01
              • 2016-03-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多