3

我正在对 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循环)?

4

4 回答 4

5

如果您确定始终只有一个字符串,则可以 return value.Single()

还有一些选择:

如果有多个元素(使用SingleSingleOrDefault),或者根本没有元素(使用First或),这取决于您是否要引发异常Single

如果您总是只排除一个元素,我会坚持使用Single(),因为如果有零个或多个元素,它将引发异常。

于 2012-07-09T14:01:12.497 回答
3

Single/SingleOrDefaultFirst/FirstOrDefault方法可以将可枚举的元素解析为一个。

Single方法只需要一个元素,如果结果包含零个或多个元素,则会异常。用于SingleOrDefault应付零和一。

“第一”对都可以处理多个,但First如果没有元素,则再次抛出。

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

在你的情况下:

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

在 Single 或 First 之间进行选择时,Single如果您期望一个元素,则使用,SingleOrDefault如果您期望零个或一个元素,则使用,如果您不关心返回多少元素,请使用First/ FirstOrDefault(以及某种类型)。OrderBy

另请注意,这些方法使用延迟执行,因此一旦First满足它就会停止迭代。

于 2012-07-09T14:02:38.990 回答
2

如果您只想退回一件商品,请使用FirstOrDefault()

public string getValue()
{
    IEnumerable<string> value = from item in myFile.Descendants("ProductName")
                        select (string)item;
    return value.FirstOrDefault();
}
于 2012-07-09T14:01:00.717 回答
0

如果您确定只有一个并且必须只有一个,您应该使用Single. 如果您有多个,这实际上会引发异常。

于 2012-07-09T14:06:11.557 回答