【问题标题】:What if IEnumerable<string> returns just one string如果 IEnumerable<string> 只返回一个字符串怎么办
【发布时间】:2012-07-09 13:59:53
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如果你确定总是只有一个字符串,你可以返回value.Single()

    更多选择:

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

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

    【讨论】:

    • 感谢 @BigYellowCactus 的回复,但我选择了 Adam Houldsworth,因为他给出了代码示例和针对这种情况的最佳解释。
    【解决方案2】:

    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 的要求,它就会停止迭代。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2014-10-23
          • 1970-01-01
          • 2022-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-17
          • 2018-06-28
          相关资源
          最近更新 更多