2010-06-29 5 views
9

질문은 다음과 같습니다. 각 루프에 대해 XML 파일의 쿼리에서 데이터를 검색하는 데 사용하고있는 문자열이 있습니다. 과 같이 : 나는 사실을 알고foreach를 한 번 실행하기

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

만 dateQuery에서 하나 개의 값이 될 것이라고합니다 (XML 파일의 값을 저장 및 쿼리가 사용되는 방식에 따라).

따라서 (내 프로그램을보다 효율적으로 작성하고 코드 작성 방법을 배우려는 목적으로) 더 나은 방법이 있는지 아니면 foreach가 유일한 방법인지 알고 싶습니다.

+0

이 질문에 대답하는 데 오랜 시간 (3 분)이 걸릴 것으로 생각됩니다. – xcud

+0

가끔 질문이 나타나기까지 잠시 시간이 걸립니다. 특히 첫 페이지에 (질문을 클릭하지 않을 때) – tster

답변

18

당신은 사용할 수 있습니다 : 쿼리에 여러 항목이있는 경우

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

이 실패하지 않습니다. 여러 항목이있는 경우는 다음 .NET 3.5 이상을 사용하는 경우 단일

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

를 사용, 실패 할 경우에 당신은 확장 메서드 Enumerable.Single 사용할 수 있습니다 그리고

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

당신의 가정 '이됩니다 단 하나의 값을 dateQuery '잘못된 것입니다 예외가 throw됩니다.

+0

tster : 나는 그것을 제거했다. 그는 var를 사용하여 3.5를 사용하고 있음이 분명하다. –

2

dateQuery의 첫 번째 색인에 액세스 할 수 없습니까?

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

IEnumerable이 아닌 경우 tster

+0

@tster - 동의하지만이 질문에 함축되어 있지 않습니다. – Oded

+0

dateQuery에 적어도 하나 이상의 요소가 있는지 확인해야합니다. 그렇지 않으면 범위를 벗어나는 인덱스 예외가 발생합니다. – JLWarlow

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

당신은

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

당신은 좁은 방을 사용할 수 있습니다 시도 할 수 있습니다() 또는 .Single() ,하지만 dataQuery에 아무 것도 없으면 예외가 발생합니다.

+2

젠장, 정말 여기 무승부에 빨리해야합니다! – Pharabus

+0

나는 동의한다,이 대답은 괜찮아. 그들은 너무 빨리 왔어. : / –

2

를 사용할 수있는 경우

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

Mark 's Answer가 훨씬 더 좋습니다. 그러나 foreach 루프를 설명하기 위해 제 의견을 밝혔습니다. ,

using System.Linq; 

dateQuery.Single(); 
4

Emmanual 당신이 한 번만 뭔가를 할 필요가 알고 있다면, 당신은 루프를 사용하지 않아야합니다 : 트릭을 할해야

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

합산 :

  • 사용 우선()는 첫 번째 항목을 원하고 적어도 하나 (또는 ​​그 이상)의 순서로 항목이 있음을 알고있는 경우.
  • 사용 FirstOrDefault() 순서 항목의 수를 가질 수 있다면
  • 순서가 항상 0 또는 1 항목 중 하나가있는 경우 순서가) (정확히 하나의 항목
  • 사용 SingleOrDefault을 가질 수 있다면 싱글()를 사용
  • 당신은 생략 할 수 있도록 조건을 다음 버전도 있다는 것을

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

var result = sequence.First(predicate);