【问题标题】:How to remove characters from a string using LINQ如何使用 LINQ 从字符串中删除字符
【发布时间】:2010-12-06 20:55:18
【问题描述】:

我有一个类似的字符串

XQ74MNT8244A

我需要从字符串中删除所有char

所以输出会是这样的

748244

如何做到这一点? 请帮我这样做

【问题讨论】:

  • 您不需要regex - 请参阅@Tim Robinson 的回答。
  • 您不想要 LINQ 答案?你能重写你的问题,或者关闭它并发布一个新问题吗?
  • 您的问题要求使用 LINQ,但您的评论要求使用正则表达式。你究竟想要什么?在这种情况下,我认为 LINQ 是最好的解决方案,因为 Tim Robinson 的解决方案比任何基于 RegEx 的解决方案都更具可读性。

标签: c# linq string lambda char


【解决方案1】:
new string("XQ74MNT8244A".Where(char.IsDigit).ToArray()) == "748244"

【讨论】:

  • +1。十分优雅。这里有一个问题。 Where(char.IsDigit) 在这种情况下如何工作?我认为您必须在这里写Where(c => char.IsDigit(c))?在这种情况下,编译器会做一些魔术吗?此处将不胜感激。
  • @Øyvind - 没有魔法。 Char.IsDigit 是一个函数,它接受 char 并返回 bool - 正是 Where 所期望的。您不必将其包装在匿名函数中。 (哦,编译器还是做了很多魔法,比如匿名函数)
  • @Øyvind 您可以为Where 方法提供任何委托; lambda 语法只是获取委托的一种方式。如果你的 lambda 直接调用了某个方法,并且该方法的参数类型和返回类型与 lambda 匹配,则可以直接提供方法名称。
  • @Kobi 和 Tim - 谢谢。我看到它当然应该以这种方式工作,但我从未想过它。这可能会使我的代码在某些可以省略包装器的地方更整洁。非常感谢。
  • 值不在一个字符串中。它被索引和分离。如何将数字或字母组合成一个字符串?
【解决方案2】:

两个选项。在 .Net 4 上使用 Linq(在 3.5 上类似 - 它没有那么多方法重载):

string s1 = String.Concat(str.Where(Char.IsDigit));

或者,使用正则表达式:

string s2 = Regex.Replace(str, @"\D+", "");

我应该补充一点,IsDigit\D 可以识别 Unicode,因此它可以接受除 0-9 之外的很多数字,例如 "542abc٣٤"
您可以轻松地将它们调整为09 之间的检查,或[^0-9]+

【讨论】:

  • 使用 LINQ 可以做很多事情,但这并不意味着它应该用于所有事情。 +1 建议 RegEx 选项。
  • 这里使用 string.concat 比我想使用的 .ToArray() 更好。
  • @Unmesh 我同意很容易将 Linq 视为一把金锤,在某些情况下我自己也对此感到内疚。在这种情况下,我认为 Linq 解决方案比 Regex 更易于阅读。 (也可能更快)
  • @Andy - 谢谢!同样,.Net 4 有一个接受 IEnumerable<char> 的重载,因此它非常适合,并且可能为此进行了优化。
【解决方案3】:
string value = "HTQ7899HBVxzzxx";
Console.WriteLine(new string(
     value.Where(x => (x >= '0' && x <= '9'))
     .ToArray()));

【讨论】:

    【解决方案4】:

    如果你只需要数字并且你真的想要 Linq,试试这个:

    youstring.ToCharArray().Where(x => char.IsDigit(x)).ToArray();
    

    【讨论】:

    • ToCharArray() 在这里没用,因为它实现了 IEnumerable
    • @PierrOz - 这绝对是真的。但是,Visual Studio 2008 Intellisense 隐藏了 IEnumerable&lt;Char&gt; 扩展方法,因此很容易错过。
    【解决方案5】:

    使用 LINQ:

    public string FilterString(string input)
    {
        return new string(input.Where(char.IsNumber).ToArray());
    }
    

    【讨论】:

      【解决方案6】:

      这样的?

      
      "XQ74MNT8244A".ToCharArray().Where(x => { var i = 0; return Int32.TryParse(x.ToString(), out i); })
      

      【讨论】:

        【解决方案7】:
        string s = "XQ74MNT8244A";
        var x = new string(s.Where(c => (c >= '0' && c <= '9')).ToArray());
        

        【讨论】:

          【解决方案8】:

          如何为您执行此操作的扩展方法(和重载):

              public static string NumbersOnly(this string Instring)
              {
                  return Instring.NumbersOnly("");
              }
          
              public static string NumbersOnly(this string Instring, string AlsoAllowed)
              {
                  char[] aChar = Instring.ToCharArray();
                  int intCount = 0;
                  string strTemp = "";
          
                  for (intCount = 0; intCount <= Instring.Length - 1; intCount++)
                  {
                      if (char.IsNumber(aChar[intCount]) || AlsoAllowed.IndexOf(aChar[intCount]) > -1)
                      {
                          strTemp = strTemp + aChar[intCount];
                      }
                  }
          
                  return strTemp;
              }
          

          重载是为了让您可以保留“-”、“$”或“.”以及,如果你愿意(而不是严格的数字)。

          用法:

          string numsOnly = "XQ74MNT8244A".NumbersOnly();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-12-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多