2011-07-11 38 views
2

假设我有以下列表:Linq查询来查找列表中的非数字项目?

 var strings = new List<string>(); 
     strings.Add("1"); 
     strings.Add("12.456"); 
     strings.Add("Foobar"); 
     strings.Add("0.56"); 
     strings.Add("zero"); 

是否有某种形式的查询,我可以在LINQ的编写将返回我只有数字的项目,即第一,第二和第四的项目从列表中?

-R。

+2

一步,然后问自己,为什么你在处理一个stringly类型的数据单个列表?我只是在猜测,但也许这里的答案是重新定义问题。 –

+0

@Anthony:数据以我无法控制的字符串数组的形式返回给我,我只是在执行.ToList()以试图放入某个查询以获取数字数据,然后从那里我将指定类型。 – Randy

+0

@Randy,你不需要在数组上调用'ToList()'来在查询中使用它。 – svick

回答

2
strings.Where(s => { double ignored; return double.TryParse(s, out ignored); }) 

这将返回所有可解析为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; 
    } 
} 

不要忘记,double.TryParse()使用您当前的文化,所以它会给不同的计算机上不同的结果。如果您不想要,请使用double.TryParse(s, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result)

+0

D'oh。我知道这会很简单。脑死了 - 谢谢。 – Randy

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)); 
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 == '.')); 
+0

负数呢?那么指数表示法(目前尚不清楚是否应该处理)呢? – svick

+0

@svick OP没有指定其中的任何一个约束。这是基于所提供的样本数据的假设的“快速和肮脏”验证。就个人而言,我认为“TryParse”对于提供简单的样本数据进行简单的验证有很多不必要的开销。这个答案不适用于“任务关键”验证,只是替代更复杂解决方案(由OP根据自己的需求决定)。 –

+0

如果比适当的解决方案或类似案例短得多,我可以看到“快速和肮脏”的观点,但我不确定这是否是这种情况。至于表演,我真的怀疑这是一个问题,所以我不会根据这个决定做出决定。 – svick