2010-06-29 21 views
9

So ist die Frage, ich habe eine für jede Schleife, die ich derzeit zum Abrufen von Daten aus einer Abfrage einer XML-Datei verwenden, die dann in eine Zeichenfolge eingefügt wird; so wie:Eine Foreach zum Ausführen einmal

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

ich für eine Tatsache wissen (Basierend auf dem Weg der XML-Datei speichert Werte und die Abfrage verwendet werden), dass es nur ein Wert in dateQuery sein wird.

Also würde ich gerne wissen (für die Zwecke, um mein Programm effizienter und lernen, wie man besser programmieren), gibt es einen besseren Weg, dies zu tun oder sind Foreach der einzige Weg?

+0

Ich kann nicht glauben, dass es so lange dauerte (3 Minuten), um diese Frage zu beantworten. – xcud

+0

Es dauert eine Minute, bis Fragen angezeigt werden. Vor allem auf der Titelseite (nicht, wenn Sie auf "Fragen" klicken) – tster

Antwort

18

könnten Sie verwenden:

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

Dies wird es nicht versäumen, wenn mehrere Elemente in der Abfrage ist. Wenn Sie es nicht wollen, wenn es mehrere Elemente sind, dann Einzel

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

verwenden Wenn Sie .NET 3.5 oder höher verwenden, können Sie die Erweiterungsmethode verwenden Enumerable.Single:

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

Dann, wenn Ihre Annahme ‚wird es Nur ein Wert in dateQuery 'ist falsch, es wird eine Ausnahme ausgelöst.

+0

Tster: Ich habe es entfernt - es ist klar, er verwendet 3,5 von der Verwendung von Var. –

2

Können Sie nicht einfach auf den ersten Index von dateQuery zugreifen?

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

Nicht wenn es IEnumerable ist tster

+0

@tster - Einverstanden, aber das ist nicht in der Frage impliziert. – Oded

+0

Sie müssen überprüfen, ob dateQuery mindestens ein Element enthält, andernfalls erhalten Sie eine Ausnahme außerhalb des Bereichs. – JLWarlow

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

, wenn Sie in der Lage sind LINQ zu verwenden

+2

Verdammt, du musst wirklich schnell hier sein! – Pharabus

+0

Ich stimme zu, diese Antworten waren in Ordnung; und sie kamen so schnell. : / –

2

Sie können versuchen,

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

Sie .First nutzen könnten() oder Single() , aber wenn in dataQuery nichts vorhanden ist, wird eine Ausnahme ausgelöst.

5

Marks Antwort ist bei weitem die beste, aber ich habe meine zur Veranschaulichung foreach-Schleife.

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

, die den Trick tun sollten:

using System.Linq; 

dateQuery.Single(); 
4

Emmanual, wenn Sie wissen, dass Sie nur einmal etwas tun müssen, sollten Sie nicht eine Schleife verwenden.

4

Zusammengefasst:

  • Verwendung First(), wenn Sie das erste Element wollen und wissen, dass es zumindest eine (oder mehr) Elemente in der Sequenz ist.
  • Verwendung FirstOrDefault(), wenn die Sequenz beliebige Anzahl von Elementen haben
  • verwenden Einzel(), wenn die Sequenz genau
  • Verwendung SingleOrDefault ein Element(), wenn die Sequenz immer entweder null oder ein Element hat
  • haben

Hinweis, dass es auch Versionen davon, die Prädikate nehmen, so dass Sie

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

zu

0 abkürzen kann
var result = sequence.First(predicate); 
Verwandte Themen