使用LINQ从字符串列表中提取整数

jlb*_*b83 7 c# linq list

我有一个List<string>,其中一些字符串是数字.我想将这个子集提取到一个List<int>.

我用相当冗长的方式完成了这个 - 如下所示 - 但我觉得必须有一个更整洁的LINQ方式来构建它.有任何想法吗?

List<string> myStrs = someListFromSomewhere;
List<int> myInts = new List<int>();

foreach (string myStr in myStrs)
{
    int outInt;
    if (int.TryParse(myStr, out outInt))
    {
        myInts.Add(outInt);
    }
}
Run Code Online (Sandbox Code Playgroud)

显然我不需要解决这个问题 - 它主要用于我的LINQ教育.

Dan*_*rth 23

你可以这样做:

int parsed = 0;

myInts = myStrs.Where(x => int.TryParse(x, out parsed)).Select(x => parsed);
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为LINQ运算符的执行是延迟的,这意味着:
对于每个项目,myStrs首先执行代码Where并将结果写入parsed.如果TryParse返回true,Select则执行代码.在为下一个项目运行整个代码之前,运行一个项目的整个代码.

  • LINQ-to-Objects,即.当我的代码工作时,你的代码会破坏AsParallel(). (6认同)
  • 对我来说看起来很脆弱. (3认同)

dtb*_*dtb 7

LINQ和out参数混合不好.你可以这样做:

var myInts = myStrs
    .Select(s =>
    {
        int outInt;
        return int.TryParse(s, out outInt) ? (int?)outInt : null;
    })
    .Where(i => i.HasValue)
    .Select(i => i.Value)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

  • 绝对矫枉过正 (4认同)
  • @FredrikMörk:足够公平.但在这种情况下,根本不要使用LINQ并使用OP已有的经典循环.它不是更多的代码,它比dtb提供的解决方案更具可读性. (2认同)