2012-07-09 76 views
3

我做一个简单的Linq查询上的XML文件如果IEnumerable的<string>回报只是一个字符串

IEnumerable<string> value = from item in myFile.Descendants("ProductName") 
          select (string)item; 

通常情况下(如果我有一个以上的行),我可以使用foreach循环遍历:

foreach (string str in value) 
{ 
    Console.WriteLine(str); 
} 

但是,如果我敢肯定,我只有一个项目,我的方法签名是什么:

public string getValue() 
{ 
    return ?; 
} 

我应该返回什么(如果我想删除foreach循环)?

回答

3

Single/SingleOrDefaultFirst可以解析元件的可枚举下降到一个/ FirstOrDefault方法。

Single的方法预计只有一个元素和意愿异常,如果结果中包含零个或一个以上的元件。使用SingleOrDefault来应对零和一个。

“First”对可以同时处理多个,但如果没有元素,则会再次抛出First

所有这些方法都带有重载,允许您指定条件,从而无需使用.Where调用。

你的情况:

string value = (from item in myFile.Descendants("ProductName") 
       select (string)item) 
       .SingleOrDefault(); 

当单个或一之间进行选择,使用Single如果你希望一个元素,使用SingleOrDefault如果你希望零个或一个元素,并使用First/FirstOrDefault(带有某种沿OrderBy)如果你不在乎有多少元素被返回。

另请注意,这些方法使用延迟执行,所以一旦满足First它将停止迭代。

2

如果你想只返回一个项目,然后用FirstOrDefault()

public string getValue() 
{ 
    IEnumerable<string> value = from item in myFile.Descendants("ProductName") 
         select (string)item; 
    return value.FirstOrDefault(); 
} 
5

如果你相信,总有一个确切的字符串,可以返回value.Single()

有些选项:

这取决于如果你想,如果有一个以上的元素(使用是引发异常SingleSingleOrDefault ),或根本没有元素(使用FirstSingle )。

如果你总是除了一个元素,我会坚持Single(),因为如果有零个或多个元素,它会抛出一个异常。

+0

谢谢@BigYellowCactus的回复,但我选择了Adam Houldsworth,因为他给出了一个代码示例,并解释了这种情况。 – 2012-07-09 14:18:26

+0

@Wassim没问题:-) – sloth 2012-07-09 14:26:31

0

如果您确定只有一个,且只能有一个,则应使用Single。 这实际上会抛出一个异常,如果你有多个。

相关问题