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);