从字符串数组中获取第一个双精度值

问题描述:

在一种方法中,我们收到一个Array of Strings。此数组的,我们必须返回的第一个值是一个Double从字符串数组中获取第一个双精度值

例子:

String[] myArray = {"abc", "def" , "1.0", "1.1" }; output:1.0 
String[] myArray2 = {"abc", "def" , "ij" , "57.0"}; output:57.0 
String[] myArray3 = {"11.1","abc", "def" , "ij" , "57.0"}; output:11.1 

为了实现这一目标,我们使用下面的代码:

Double i = 0; 
foreach(String s in myArray) 
{ 
    Double.TryParse(s, out i); 
    if (i > 0) 
    { return i; } 
} 

我在想,如果有一个短达到相同结果的方式? 谢谢你的时间!

double n; 
string d = myArray.First(x => double.TryParse(x, out n)) 

你可以返回n,这将是相等的第一个有效double值。顺便说一句,在你的例子中,如果i > 0正在搜索,你应该检查TryParse的结果,如果它是true返回i

编辑:正如评论中所建议的First方法将抛出一个异常,如果在数组中没有有效的数字。如果是这样的话,你可以使用FirstOrDefault和检查结果:

string d = myArray.FirstOrDefault(x => double.TryParse(x, out n)) 

if(d != null) return n; 
else /* return a default value */ 
+0

如果没有任何... – 2014-09-24 08:53:04

+0

如果数组不包含任何满足谓词的元素,可能会更好使用FirstOrDefault,所以它将返回null而不是抛出'InvalidOperationException'。 – tdragon 2014-09-24 08:53:52

+0

正是我一直在寻找!谢谢你的时间来帮助我! – User999999 2014-09-24 08:56:35

只是另一种方式:

double n; 
var doubleFound = myArray.Any(x => double.TryParse(x, out n)); 

这里,只关心双是否已经找到,而不是返回一个字符串背部。但它完全取决于你想要做什么。

只要有人想知道,我在LinqPad中测试了它,它确实返回了列表中的第一个双精度值。

我觉得用这个方法或FirstOrDefault归结为两件事情:

  1. 你想在找到一个值的结果做什么?要使用

的主要区别

  • 语义,是一个将返回什么导致它的阵列(FirstOrDefault)和第二只想说一个人是否被发现在发现。

  • +0

    但是它会返回第一个双倍还是双倍? – User999999 2014-09-24 08:55:51

    +0

    是的......我只是想过,我重读了这个问题。我认为它可能会返回最后一个......我认为这更多的是检查数组是否有双精度。 – 2014-09-24 08:57:02

    +0

    我刚测试过它,它确实返回第一个值 – 2014-09-24 08:58:08