Linq查询列表中的非数字项?

时间:2011-07-11 23:25:36

标签: linq list types

假设我有以下列表:

        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

3 个答案:

答案 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 == '.' ) );