我有一个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和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)