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

时间:2012-01-18 13:21:56

标签: 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);
    }
}

显然我不需要这个解决方案 - 它主要用于我的LINQ教育。

4 个答案:

答案 0 :(得分:23)

你可以这样做:

int parsed = 0;

myInts = myStrs.Where(x => int.TryParse(x, out parsed)).Select(x => parsed);

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

答案 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: "") }
    }
}