假设我有以下列表:
var strings = new List<string>();
strings.Add("1");
strings.Add("12.456");
strings.Add("Foobar");
strings.Add("0.56");
strings.Add("zero");
我是否可以在Linq中编写某种查询,只返回数字项,即列表中的第1,第2和第4项?
-R
答案 0 :(得分:3)
试试这个:
double dummy = 0;
var strings = new List<string>();
strings.Add("1");
strings.Add("12.456");
strings.Add("Foobar");
strings.Add("0.56");
strings.Add("zero");
var numbers = strings.Where(a=>double.TryParse(a, out dummy));
答案 1 :(得分:2)
strings.Where(s => { double ignored; return double.TryParse(s, out ignored); })
这将返回所有可解析为double
的字符串作为字符串。如果你想要它们作为数字(这更有意义),你可以写一个扩展方法:
public static IEnumerable<double> GetDoubles(this IEnumerable<string> strings)
{
foreach (var s in strings)
{
double result;
if (double.TryParse(s, out result))
yield return result;
}
}
不要忘记double.TryParse()
使用您当前的文化,因此它会在不同的计算机上提供不同的结果。如果您不想这样,请使用double.TryParse(s, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result)
。
答案 2 :(得分:2)
您可以使用简单的谓词来检查每个字符串,如下所示:
var strings = new List<string>();
strings.Add("1");
strings.Add("12.456");
strings.Add("Foobar");
strings.Add("0.56");
strings.Add("zero");
var nums = strings.Where( s => s.ToCharArray().All( n => Char.IsNumber( n ) || n == '.' ) );