作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我认为解释我的问题的最好方法是使用一个简短的(通用的)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/
我是一名优秀的程序员,十分优秀!