【问题标题】:Find all integers in list of strings查找字符串列表中的所有整数
【发布时间】:2013-10-06 03:35:12
【问题描述】:

鉴于此字符串值列表:

"12345""6789a""9876""23467b"

我们如何在 C# 中使用 Linq 语句来仅选择整数?换句话说,我们只想返回123459876

【问题讨论】:

    标签: c# linq parsing int


    【解决方案1】:

    您可以根据Int32.TryParse 方法的返回值过滤您的条目:

    int temp;
    list.Where(x => int.TryParse(x, out temp));
    

    【讨论】:

    • temp 值的行为是一个未记录的实现细节,将来可能会改变。我更喜欢an extension
    • @TimSchmelter:有效点。但是,只要后续代码不使用 temp 的最终值,上述解决方案仍然正确。可以将上述代码 sn-p 包含在专用语句块中以强制执行此操作。
    【解决方案2】:

    将列表过滤为仅包含所有字符都是数字的字符串:

    var filtered = list.Where(s => s.All(char.IsDigit));
    

    另一种方法是使用int.TryParse 作为过滤函数,它在行为上有许多细微差别(关于有效整数的规则允许的不仅仅是数字,请参阅documentation)。

    如果您希望将结果键入为整数,请使用 .Select(int.Parse) 跟进。

    【讨论】:

    • 这会丢失负值,以及带有前导或尾随空格的整数。
    • @Douglas:答案中明确提到了这一点;我添加了一个文档链接。
    • 是的,我正在总结人们可能会遇到的主要差异。另一方面,如果全数字假设对 OP 的数据有效,则此方法可能比 int.TryParse 更有效。
    【解决方案3】:

    intTryParse 方法是最可靠的指标,表明您有一个正确的数字。

    像这样使用它:

    int number = 0;
    var selected = list.Where(x => int.TryParse(x, out number)).ToList();
    

    【讨论】:

      【解决方案4】:

      一种方式:

      IEnumerable<int> ints = strings.Where(str => str.All(Char.IsDigit))
          .Select(str => int.Parse(str));
      

      这只会选择所有字符都是数字的字符串。然后它将它们解析为int

      更好的方法是使用这个扩展:

      public static int? TryGetInt(this string item)
      {
          int i;
          bool success = int.TryParse(item, out i);
          return success ? (int?)i : (int?)null;
      }
      

      那么你可以使用这个查询:

      IEnumerable<int> ints = strings.Select(str => str.TryGetInt())
          .Where(nullableInt => nullableInt.HasValue)
          .Select(nullableInt => nullableInt.Value);
      

      【讨论】:

        猜你喜欢
        • 2018-10-20
        • 2019-02-17
        • 1970-01-01
        • 2021-01-14
        • 2015-11-02
        • 2022-10-19
        • 2020-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多