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

在列表中查找非数字项的Linq查询?,linq,list,types,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"); var strings=newlist(); 字符串。添加(“1”); 字符串。添加(“1

假设我有以下列表:

        var strings = new List<string>();
        strings.Add("1");
        strings.Add("12.456");
        strings.Add("Foobar");
        strings.Add("0.56");
        strings.Add("zero");
var strings=newlist();
字符串。添加(“1”);
字符串。添加(“12.456”);
字符串。添加(“Foobar”);
字符串。添加(“0.56”);
字符串。添加(“零”);
我是否可以用Linq编写某种查询,只返回数字项,即列表中的第1、第2和第4项

-R

这将返回所有可解析为
double
s的字符串。如果希望它们作为数字(这更有意义),可以编写一个扩展方法:

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;
    }
}
公共静态IEnumerable GetDoubles(此IEnumerable字符串)
{
foreach(字符串中的变量s)
{
双重结果;
if(双锥虫(s,输出结果))
收益结果;
}
}
不要忘记,
double.TryParse()
使用您当前的区域性,因此它将在不同的计算机上给出不同的结果。如果您不想这样做,请使用double.TryParse(s,NumberStyles.AllowDecimalPoint,CultureInfo.InvariantCulture,out result)

尝试以下方法:

    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));
double-dummy=0;
var strings=新列表();
字符串。添加(“1”);
字符串。添加(“12.456”);
字符串。添加(“Foobar”);
字符串。添加(“0.56”);
字符串。添加(“零”);
var numbers=strings.Where(a=>double.TryParse(a,out-dummy));

您可以使用一个简单的谓词来检查每个字符串,如下所示:

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 == '.' ) );
var strings=newlist();
字符串。添加(“1”);
字符串。添加(“12.456”);
字符串。添加(“Foobar”);
字符串。添加(“0.56”);
字符串。添加(“零”);
var nums=strings.Where(s=>s.ToCharArray().All(n=>Char.IsNumber(n)| | n==');

退一步问问自己,为什么要在一个列表中处理字符串类型的数据?我只是在猜测,但也许这里的答案是重新定义问题。@Anthony:数据以字符串数组的形式返回给我,超出了我的控制范围,我正在这样做。ToList()继续尝试并输入一些查询,只获取数字数据,然后从那里我将指定类型。@Randy,你不需要调用
ToList()
在一个数组上,以便在查询中使用它。我知道这很简单。脑死亡-谢谢。负数呢?那么指数表示法呢(不清楚是否应该处理)?@svick OP没有指定这两个约束。这是一种“快速且肮脏”的验证,使用基于所提供样本数据的假设。就我个人而言,我认为“TryParse”对于提供琐碎样本数据的简单验证有很多不必要的开销。这个答案不是为了“任务关键型”验证,只是更复杂解决方案的一种替代方案(由OP根据他的需要决定)。如果它比正确的解决方案短得多,或者在类似的情况下,我可以看出“快而脏”的意义,但我不确定这里的情况是否如此。至于性能,我真的怀疑这是否是一个问题,所以我不会以此为基础做出决定。@svick这就是为什么让OP来决定什么最适合他的需要。正如我之前所说的,这只是一种替代解决方案。
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 == '.' ) );