我正在对XML文件进行简单的Linq查询
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 循环)?
答案 0 :(得分:5)
如果您确定始终只有一个字符串,则可以返回value.Single()
。
更多选择:
这取决于您是否要在有多个元素(使用Single
或SingleOrDefault
)或根本没有元素时引发异常(使用First
或{{1 }})。
如果你总是只有一个元素,我会坚持Single(),因为如果有零个或多个元素,它会抛出异常。
答案 1 :(得分:3)
有Single
/ SingleOrDefault
和First
/ FirstOrDefault
方法可以将可枚举的元素解析为一个。
Single
方法 只需要 一个元素,如果结果包含零个或多个元素,则会出现异常。使用SingleOrDefault
来处理零和一个。
“First”对可以处理多个,但如果没有元素,First
会再次抛出。
所有这些方法都带有一个重载,允许您指定条件,无需使用.Where
调用。
在你的情况下:
string value = (from item in myFile.Descendants("ProductName")
select (string)item)
.SingleOrDefault();
在Single或First之间进行选择时,如果您需要一个元素,请使用Single
,如果您需要零个或一个元素,请使用SingleOrDefault
,并使用First
/ FirstOrDefault
(如果您不关心返回多少元素,可以使用某种OrderBy
。
另请注意,这些方法使用延迟执行,因此一旦满足First
,它就会停止迭代。
答案 2 :(得分:2)
如果您只想返回一个项目,请使用FirstOrDefault()
:
public string getValue()
{
IEnumerable<string> value = from item in myFile.Descendants("ProductName")
select (string)item;
return value.FirstOrDefault();
}
答案 3 :(得分:0)
如果您确定只有一个且必须只有一个,则应使用Single
。
如果您有多个,这实际上会抛出异常。