如果IEnumerable <string>只返回一个字符串</string>,该怎么办?

时间:2012-07-09 13:59:53

标签: c# xml visual-studio-2010 linq ienumerable

我正在对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 个答案:

答案 0 :(得分:5)

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

更多选择:

这取决于您是否要在有多个元素(使用SingleSingleOrDefault)或根本没有元素时引发异常(使用First或{{1 }})。

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

答案 1 :(得分:3)

Single / SingleOrDefaultFirst / 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。 如果您有多个,这实际上会抛出异常。