我習慣於在不使用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'。 –