让foreach运行一次

时间:2010-06-29 13:07:22

标签: c# xml foreach

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

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

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

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

11 个答案:

答案 0 :(得分:18)

您可以使用:

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

如果查询中有多个项目,则不会失败。如果您希望在有多个项目时失败,请使用单个

答案 1 :(得分:8)

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

答案 2 :(得分:7)

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

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

然后,如果你的假设'在dateQuery中只有一个值'是错误的,它将抛出异常。

答案 3 :(得分:5)

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

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

答案 4 :(得分:4)

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

答案 5 :(得分:4)

总结:

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

请注意,还有一些版本采用谓词,因此您可以缩写

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

var result = sequence.First(predicate);

答案 6 :(得分:2)

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

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

答案 7 :(得分:2)

尝试Enumerable.SingleEnumerable.SingleOrDefault

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

答案 8 :(得分:2)

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

如果您能够使用LINQ

答案 9 :(得分:2)

你可以尝试

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中没有任何内容,则会抛出异常。

答案 10 :(得分:1)

应该做的诀窍:

using System.Linq;

dateQuery.Single();