2010-06-29 11 views
9

Quindi la domanda è questa, ho una per ogni ciclo che sto attualmente utilizzando per recuperare i dati da una query di un file XML che poi viene messo in una stringa; in questo modo:Ottenere un foreach da eseguire una volta

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

So per certo (Basato sul modo in cui gli XML file memorizza i valori e la query in uso) che ci sarà un solo valore in dateQuery.

Quindi, mi piacerebbe sapere (allo scopo di rendere il mio programma più efficiente e imparare a codificare meglio), c'è un modo migliore per farlo o sono foreach è l'unico modo?

+0

Non posso credere ci sia voluto così tanto tempo (3 minuti) per rispondere a questa domanda. – xcud

+0

Ci vuole un minuto perché le domande vengano visualizzate qualche volta. Soprattutto in prima pagina (non quando si fa clic su "Domande") – tster

risposta

18

Si potrebbe utilizzare:

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

Questo non avrà esito negativo se non v'è più elementi nella query. Se si vuole il fallimento se non ci sono più elementi, quindi utilizzare singolo

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

Se si utilizza .NET 3.5 o più recente è possibile utilizzare il metodo di estensione Enumerable.Single:

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

Poi, se la tua ipotesi 'non ci sarà solo un valore in dateQuery 'è sbagliato, genererà un'eccezione.

+0

tster: l'ho rimosso - è chiaro che sta usando 3.5 dall'uso di var. –

2

Non puoi semplicemente accedere al primo indice di dateQuery?

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

Non se è IEnumerable tster

+0

@tster: concordato, ma ciò non è implicito nella domanda. – Oded

+0

Dovresti controllare quella dataQuery ha almeno un elemento altrimenti otterrai un indice fuori dall'eccezione. – JLWarlow

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

se si è in grado di utilizzare LINQ

+2

dannazione, devi davvero essere veloce nel sorteggio qui! – Pharabus

+0

Sono d'accordo, queste risposte andavano bene; e sono venuti così velocemente. : / –

2

si può provare

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

si potrebbe usare .Prima() o .Single() , ma se non c'è nulla in dataQuery verrà generata un'eccezione.

5

Mark's Answer è di gran lunga il migliore, ma ho messo il mio per illustrare il ciclo foreach.

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

che dovrebbe fare il trucco:

using System.Linq; 

dateQuery.Single(); 
4

Emmanual, se sai che solo bisogno di fare qualcosa una volta, non si dovrebbe usare un ciclo.

4

Riassumendo:

  • uso First() se si desidera che il primo elemento e sapere che c'è almeno una (o più) elementi nella sequenza.
  • uso FirstOrDefault() se la sequenza può avere qualsiasi numero di elementi
  • utilizzare singola() se la sequenza può avere esattamente un elemento
  • uso SingleOrDefault() se la sequenza ha sempre zero o un articolo

Nota che ci sono anche versioni di questi che prendono predicati, in modo che è possibile abbreviare

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

a

var result = sequence.First(predicate); 
Problemi correlati