我习惯于在不使用Linq或Lambda语句的情况下编写C#,但我想提高我的理解。我有代码看起来像这样写在C#2.0中有foreach
循环:如何将字符串列表转换为整数忽略非整数
List<string> strings = new List<string>();
strings.Add("1");
strings.Add("blah");
List<int> ints1 = new List<int>();
foreach (string x in strings)
{
int r;
if (int.TryParse(x, out r))
ints1.Add(r);
}
它做一个简单的任务 - 从一个字符串列表填充整数列表,忽略任何实际并非整数。 在我有限的经验中,Linq和Lambda语句似乎能够将foreach语句简化成非常简洁和可读的方式来做同样的事情。所以我想我会用C#3.0来试试这个小小的。但最好的我能拿出来的是这样的:
IEnumerable<int> ints2 = strings.Select(x =>
{
int r;
if (int.TryParse(x, out r))
return r as int?;
return null;
})
.Where<int?>(x => x != null)
.Select(x => x.Value);
Yu!我无法找到一种方法在一次调用中将转换和过滤结合起来,并最终看起来比原来差得多。有没有办法做到这一点,或者我应该坚持我的foreach?
编辑:总结发现,这里有2种方式,如果你使用的是.NET 4.0的LINQ做到这一点:
IEnumerable<int> ints1 = strings
.Where(x => new Int32Converter().IsValid(x))
.Select(x => int.Parse(x));//Broken in .NET 3.5 due to bug in Int32Converter
IEnumerable<int> int2 = strings
.Where(x => { int r; return int.TryParse(x, out r); })
.Select(x => int.Parse(x));
第二种方法是更快,不破在.net 3.5。根据公认的答案,可能没有理由不把它放入扩展方法中,而不是按照foreach。 有关Int32Converter
错误,请参阅connect issue。
我喜欢'foreach'。 –