我有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);
}
}
显然我不需要这个解决方案 - 它主要用于我的LINQ教育。
答案 0 :(得分:23)
你可以这样做:
int parsed = 0;
myInts = myStrs.Where(x => int.TryParse(x, out parsed)).Select(x => parsed);
这是有效的,因为延迟了LINQ运算符的执行,这意味着:
对于myStrs
中的每个项目,首先执行Where
中的代码,并将结果写入parsed
。如果TryParse
返回true
,Select
中的代码将被执行。一个项目的整个代码在为下一个项目运行整个代码之前运行。
答案 1 :(得分: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();
答案 2 :(得分:0)
因为这是针对LINQ教育的...如果你真的在寻找如何只使用LINQ语法来完成这个,另一个选择是将解析逻辑移动到一个封装结果和值的类。
var myInts = from val in myStrs
let parserVal = new Parser(val)
where parserVal.IsInt
select parserVal.Val;
Parser就是这样......
class Parser
{
public bool IsInt { get; set; }
public int Val { get; set; }
public Parser(string val)
{
int outVal;
IsInt = int.TryParse(val, out outVal);
if (IsInt)
{
Val = outVal;
}
}
}
答案 3 :(得分:0)
选择不重复,然后解析每个选定的项目
extension UILabel {
@IBInspectable var localizableText: String? {
get { return text }
set(value) { text = NSLocalizedString(value!, comment: "") }
}
}