2010-06-29 25 views
9

Soru şu ki, şu anda bir dizeye eklenir bir XML dosyasının bir sorgudan veri almak için şu anda kullandığım her döngü için bir var; şöyle: Ben bir gerçeği biliyorumBir kez çalıştırmak için bir foreach alma

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

sadece dateQuery bir değer olacağı (xml dosyada değerleri ve sorgu kullanılan yolda dayanarak). Bu nedenle, (programımı daha verimli hale getirme ve daha iyi kod yazmayı öğrenme amacıyla) bilmek isterim, bunu yapmanın daha iyi bir yolu var mıdır yoksa tek yolu budur?

+0

Bu soruyu cevaplamanın çok uzun sürdüğüne inanamıyorum (3 dakika). – xcud

+0

Soruların bazen görünmesi bir dakika alır. Özellikle ön sayfada ("Sorular" ı tıkladığınızda değil) – tster

cevap

18

Sen kullanabilirsiniz: sorguda birden çok öğe varsa

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

Bu başarısız olmaz. Eğer birden çok öğe varsa eğer o zaman .NET 3.5 veya daha yeni kullanıyorsanız Tek

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

kullanmak, başarısız istiyorsanız uzatma yöntemini Enumerable.Single kullanabilirsiniz: Sonra

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

sizin varsayım 'orada olacak eğer dateQuery sadece bir değer yanlıştır, yanlış bir istisna atacaktır.

+0

tster: Onu kaldırdım - var kullanmasından 3.5 kullanıyor. –

2

dateQuery ilk dizine erişemiyor musunuz?

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

IEnumerable tster

+0

@ tster - Anlaşıldıysa, ancak bu soruda ima edilmez. – Oded

+0

Bu tarihi kontrol etmeniz gerekir. Sorgu en az bir öğeye sahipse, aksi halde aralık dışı durumdan bir dizin alırsınız. – JLWarlow

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

Sen

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

Sen .first kullanabilirsiniz deneyebilirsiniz() veya yalnız() Ancak, dataQuery'de hiçbir şey yoksa, bir istisna atılır.

+2

lanet olsun, gerçekten burada çekilişte çabuk olmalısınız! – Pharabus

+0

Katılıyorum, bu cevaplar iyiydi; ve çok hızlı geldiler. : / –

2

kullanmak mümkün olup olmadığını

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

Mark'ın Cevabı şimdiye kadarki en iyisi, ama foreach döngüsünü göstermek için benimkini koyuyorum. ,

using System.Linq; 

dateQuery.Single(); 
4

Emmanual Eğer sadece bir kez bir şeyler yapmak gerekiyor biliyorsanız, bir döngü kullanmamalısınız: hile yapmak gerekir

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

özetlersek:

  • kullanım Birinci() ilk öğeyi istiyor ve en az bir (veya daha fazla) sırayla ürün olduğunu biliyorsanız.
  • kullanımı FirstOrDefault() = Seri herhangi bir sayı olabilir, eğer
  • dizisi her zaman sıfır ya da bir öğe ya varsa sekansı) (tam bir et
  • kullanımı SingleOrDefault olabilir eğer Tek() kullanmak
  • Eğer kısaltmak böylece yüklemler'ıN almak bunların sürümleri de vardır

Not

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

için

var result = sequence.First(predicate); 
İlgili konular