2010-06-29 10 views
9

Entonces la pregunta es esta, tengo una por cada ciclo que estoy usando actualmente para recuperar datos de una consulta de un archivo XML que luego se pone en una cadena; de este modo:Obteniendo un forech para ejecutar una vez

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

Sé que es un hecho (Basado en la forma en que los archivos XML almacena los valores y la consulta se utilizan) que sólo habrá un valor en dateQuery.

Por lo tanto, me gustaría saber (con el fin de hacer que mi programa sea más eficiente y aprender a codificar mejor), ¿hay una mejor manera de hacerlo o la única forma de hacerlo es Foreach?

+0

No puedo creer que haya tardado tanto (3 minutos) en responder esta pregunta. – xcud

+0

Tarda un minuto para que las preguntas aparezcan a veces. Especialmente en la página principal (no cuando hace clic en "Preguntas") – tster

Respuesta

18

que puede usar:

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

Esto no fallará si hay varios elementos en la consulta. Si quieres que falle si hay varios artículos, a continuación, utilizar solo

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

Si está utilizando .NET 3.5 o posterior se puede utilizar el método de extensión Enumerable.Single:

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

Entonces si su supuesto 'habrá solo un valor en dateQuery 'es incorrecto arrojará una excepción.

+0

tster: Lo eliminé, está claro que está usando 3.5 del uso de var. –

2

¿No puede simplemente acceder al primer índice de dateQuery?

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

No si es IEnumerable tster

+0

@tster - De acuerdo, pero eso no está implícito en la pregunta. – Oded

+0

Debería verificar que dateQuery tenga al menos un elemento; de lo contrario, obtendrá una excepción de índice fuera de rango. – JLWarlow

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

si usted es capaz de utilizar LINQ

+2

maldita sea, ¡realmente necesitas ser rápido en el sorteo aquí! – Pharabus

+0

Estoy de acuerdo, estas respuestas fueron correctas; y llegaron tan rápido. : / –

2

Usted puede intentar

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

usted podría utilizar .First() o solo; o soltero; o soltera() , pero si no hay nada en dataQuery, se lanzará una excepción.

5

Mark's Answer es de lejos el mejor, pero puse el mío para ilustrar el ciclo foreach.

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

que debe hacer el truco:

using System.Linq; 

dateQuery.Single(); 
4

Emmanual, si sabe que sólo tiene que hacer algo una vez, no se debe utilizar un bucle.

4

Resumiendo:

  • primer lugar el uso() si desea que el primer artículo y sabe que hay por lo menos una (o más) elementos de la secuencia.
  • uso FirstOrDefault() si la secuencia puede tener cualquier número de elementos
  • Uso individual() si la secuencia puede tener exactamente un elemento
  • uso SingleOrDefault() si la secuencia siempre tiene cero o un elemento

Tenga en cuenta que también hay versiones de éstos que tienen predicados, por lo que se puede abreviar

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

a

var result = sequence.First(predicate); 
Cuestiones relacionadas