让foreach循环只运行一次的方法

9
所以问题是这样的,我有一个for each循环,目前正在使用它从XML文件的查询中检索数据,然后将其放入字符串中,如下所示:
foreach (var value in dateQuery)
                date = value.Element("HistoryCreation").Value;

基于xml文件存储值的方式和所使用的查询,我可以确定 dateQuery 中只有一个值。

因此,为了使我的程序更加高效并学习更好的编码方法,我想知道是否有更好的方法来实现这个功能,或者 foreach 是唯一的选择?


我简直不敢相信回答这个问题竟然花了这么长时间(3分钟)。 - xcud
有时候需要一分钟才能显示问题,特别是在首页上(而不是点击“问题”时)。 - tster
11个回答

20

你可以使用:

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

如果查询中有多个项目,这段代码不会失败。 如果你想要在有多个项目时使其失败,则使用 Single 方法。


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

7

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

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

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

tster:我把它删掉了 - 从使用 var 可以清楚地看出他正在使用3.5。 - Mark Byers

5

Mark的答案是目前最好的,但我放我的作为foreach循环的说明。

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

5

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


4

总结:

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

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

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

to

var result = sequence.First(predicate);

2

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

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

@tster - 我同意,但这并没有在问题中暗示。 - Oded
你需要检查dateQuery至少有一个元素,否则会出现索引超出范围的异常。 - John Warlow

2

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

如果您能够使用LINQ


2
该死,你在这里真的需要快速反应! - Pharabus
我同意,这些答案都是正确的;而且它们来得如此之快。 :/ - Immanu'el Smith

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中没有任何内容,将会引发异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接