2010-06-29 84 views
9

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

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

我知道一个事实,即只会在dateQuery一个值(正在使用的XML文件存储值和查询的方式基于)。因此,我想知道(为了让我的程序更高效,并学习如何更好地编写代码),有没有更好的方法来做到这一点,或者是foreach的唯一方法?

+0

我不敢相信花了这么长的时间(3分钟)来回答这个问题。 – xcud 2010-06-29 13:19:02

+0

需要一分钟时间才能显示问题。特别是在首页(不是当你点击“问题”时) – tster 2010-06-29 13:25:54

回答

18

你可以使用:

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

如果在查询多个项目这不会失败。如果你想,如果有多个项目,它失败,然后用单

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

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

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

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

+0

tster:我删除了它 - 很明显他使用的是使用var的3.5。 – 2010-06-29 13:14:02

2

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

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

不是如果它是IEnumerable tster 2010-06-29 13:11:33

+0

@tster - 同意,但这不是暗示在问题中。 – Oded 2010-06-29 13:12:48

+0

你需要检查dateQuery是否至少有一个元素,否则你会得到一个超出范围的异常。 – JLWarlow 2010-06-29 14:33:19

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

,如果你能使用LINQ

+2

该死的,你真的需要快点在这里画! – Pharabus 2010-06-29 13:10:41

+0

我同意,这些答案都是对的;他们来得太快了。 :/ – 2010-06-29 13:34:52

2

您可以尝试

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

你可以使用。首先()或.Single() ,但如果dataQuery中没有任何内容会抛出异常。

5

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

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

应该做的伎俩:

using System.Linq; 

dateQuery.Single(); 
4

Emmanual,如果你知道你唯一需要做的事情一次,你不应该使用一个循环。

4

总结:

  • 先用(),如果你想的第一个项目,知道至少有一个(或多个)序列中的项目。
  • 使用FirstOrDefault()如果序列可以有任意数量的项目
  • 使用单()如果序列可以有一个确切的项目
  • 使用的SingleOrDefault()如果序列始终具有零个或一个项目

注意,也有其采取断言,这样就可以缩写的这些版本

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

var result = sequence.First(predicate);