C# Linq/Lambda 表达式 : How to select an integer out of a string?

标签 c# linq linq-to-objects

我认为解释我的问题的最好方法是使用一个简短的(通用的)linq-to-objects 代码示例:

IEnumerable<string> ReadLines(string filename)
{
    string line;
    using (var rdr = new StreamReader(filename))
        while ( (line = rdr.ReadLine()) != null)
           yield return line;
}

IEnumerable<int> XValuesFromFile(string filename)
{
    return ReadLines(filename)
               .Select(l => l.Substring(3,3))
               .Where(l => int.TryParse(l))
               .Select(i => int.Parse(i));
}

请注意,此代码对整数进行了两次解析。我知道我缺少一种明显的简单方法来安全地消除其中一个调用(即因为我以前做过)。我现在找不到它。我该怎么做?

最佳答案

怎么样:

int? TryParse(string s)
{
    int i;
    return int.TryParse(s, out i) ? (int?)i : (int?)null;
}
IEnumerable<int> XValuesFromFile(string filename)
{
    return from line in ReadLines(filename)
           let start = line.Substring(3,3)
           let parsed = TryParse(start)
           where parsed != null
           select parsed.GetValueOrDefault();
}

如果您愿意,您可以将第二行/第三行组合起来:

    return from line in ReadLines(filename)
           let parsed = TryParse(line.Substring(3,3))

GetValueOrDefault 的选择是因为它跳过了转换 (int).Value 执行的验证检查 - 即它是(永远-so-slightly) 更快(我们已经检查过它不是 null)。

关于C# Linq/Lambda 表达式 : How to select an integer out of a string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2187037/

相关文章:

c# - LINQ 中的 OrderBy 和 Top 性能良好

c# - 如何将 List<object> 转换为 Json 格式并在 C# 中填充 <tbody>?

c# - 我怎样才能减少 IEnumerable<IEnumerable<Foo>> 到 IEnumerable<Foo>?

c# - 使用变量加载数据内文件

c# - Entity Framework 查询中的自定义函数有时可以正确翻译,有时则不能

database - 范围变量隐藏封闭 block LINQ 中的变量

c# - 在逗号分隔列表中查找字符串值

.net - 在 LINQ 中与匿名类型不同(在 VB.NET 中)

c# - Linq 至少一个对象必须实现 IComparable

c# - C# 中有什么方法可以在派生类中强制执行运算符重载吗?