【问题标题】:Getting a foreach to run once让 foreach 运行一次
【发布时间】:2011-03-09 15:01:36
【问题描述】:

所以问题是这样的,我有一个 for each 循环,我目前使用它从 XML 文件的查询中检索数据,然后将其放入字符串中;像这样:

foreach (var value in dateQuery)
                date = value.Element("HistoryCreation").Value;

我知道一个事实(基于 xml 文件存储值的方式和正在使用的查询)dateQuery 中只有一个值。

因此,我想知道(为了使我的程序更高效并学习如何更好地编码),是否有更好的方法来做到这一点,或者是 foreach 是唯一的方法吗?

【问题讨论】:

  • 我不敢相信回答这个问题花了这么长时间(3 分钟)。
  • 有时需要一分钟才能显示问题。尤其是在首页(不是当你点击“问题”时)

标签: c# xml foreach


【解决方案1】:

你可以使用:

dateQuery.First().Element("HistoryCreation").Value

如果查询中有多个项目,这不会失败。如果你想让它在有多个项目时失败,那么使用 Single

【讨论】:

    【解决方案2】:
    date = dateQuery.Single().Element("HistoryCreation").Value;
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 .NET 3.5 或更新版本,您可以使用扩展方法 Enumerable.Single:

      var value = dateQuery.Single();
      date = value.Element("HistoryCreation").Value;
      

      如果你的假设“dateQuery 中只有一个值”是错误的,它会抛出异常。

      【讨论】:

      • tster:我删除了它 - 很明显他使用的是 var 的 3.5。
      【解决方案4】:

      Mark 的答案是迄今为止最好的,但我将我的答案用于说明 foreach 循环。

      foreach (var value in dateQuery) {
          date = value.Element("HistoryCreation").Value;
          break;  // break current loop
      }
      

      【讨论】:

        【解决方案5】:

        Emmanual,如果你知道你只需要做一次,你不应该使用循环。

        【讨论】:

          【解决方案6】:

          总结:

          • 如果您想要第一个项目并且知道序列中至少有一个(或多个)项目,请使用 First()。
          • 如果序列可以包含任意数量的项目,则使用 FirstOrDefault()
          • 如果序列只能包含一项,则使用 Single()
          • 如果序列总是包含零项或一项,则使用 SingleOrDefault()

          请注意,这些版本也有带有谓词的版本,以便您可以缩写

          var result = sequence.Where(predicate).First();
          

          var result = sequence.First(predicate);
          

          【讨论】:

            【解决方案7】:

            你不能简单地访问dateQuery的第一个索引吗?

            date = dateQuery[0].Element("HistoryCreation").Value;
            

            【讨论】:

            • @tster - 同意,但问题中并未暗示这一点。
            • 你需要检查 dateQuery 是否至少有一个元素,否则你会得到一个索引超出范围的异常。
            【解决方案8】:

            试试Enumerable.SingleEnumerable.SingleOrDefault

             date = dateQuery.Single().Element("HistoryCreation").Value;
            

            【讨论】:

              【解决方案9】:
              dateQuery.First().Element("HistoryCreation").Value
              

              如果你能够使用 LINQ

              【讨论】:

              • 该死的,你真的需要快速抽签!
              • 我同意,这些答案都是正确的;他们来得太快了。 ://
              【解决方案10】:

              你可以试试

              var theValue = dateQuery.FirstOrDefault();
              if (theValue != null)
              {
                 data = theValue.Element("HistoryCreation").Value;
              }
              else
              {
                     //Deal with the fact that there is no data
              }
              

              您可以使用 .First() 或 .Single(),但如果 dataQuery 中没有任何内容,则会引发异常。

              【讨论】:

                【解决方案11】:

                这应该可以解决问题:

                using System.Linq;
                
                dateQuery.Single();
                

                【讨论】:

                  猜你喜欢
                  • 2021-02-18
                  • 1970-01-01
                  • 2013-11-28
                  • 1970-01-01
                  • 2018-11-28
                  • 2015-04-10
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多