2016-05-31 3 views
-2

익명 형식의 이상한 문제가 있습니다. 바로 내 코드로 점프 할 수 있도록합니다 :linq 선택 후 익명 형식이 깨졌습니다.

var anon = new[] 
{ 
    new { Var1 = 20, Var2 = 40, Var3 = 70 }, 
    new { Var1 = 25, Var2 = 45, Var3 = 75 } 
}; 

// found should be of type { int Var1, int Var2, int Var3 } 
var found = anon.Select(x => x).Where(x => x.Var1 == 25); 

var test = found.Var1 // <-- not defined error here 

아주 쉬운 질문 :
내가 LINQ를 선택 사용 후 Var1에 액세스 왜 캔트?

죄송합니다.이 주제에 대해 더 잘 설명하지 못했습니다.

+0

이 상황에서 컴파일러는'Var1'을 사용할 수없는 이유를 설명하는 오류 메시지를 생성해야합니다. – ASh

+0

어리석은 실수입니다. 이미 답변이 있기 때문에 삭제할 수도 있습니다. – C4u

+0

found.FirstorDefault(). Var1이 당신에게 anon 목록의 첫 번째 요소를 가져와야합니다. – Rangesh

답변

5

Where은 하나의 요소가 아니기 때문에 IEnumerable<>을 반환합니다. First 또는 FirstOrDefault을 사용하여 첫 번째 요소를 가져올 수 있습니다.

found.First().Var1 
+0

Oh lol im stupid. 물론 여러 결과가 가능합니다. >. <. 죄송 해요. – C4u

2

WhereIEnumerable 복귀하고 0-N의 결과를 사용한다.

항상 1 개의 결과를 얻으려면 Single이 필요합니다.

0-1 개의 결과를 얻으려면 SingleOrDefault이 필요합니다.

1-n 개의 결과를 얻으려면 First이 필요합니다.

0-n 개의 결과를 얻으려면 FirstOrDefault이 필요합니다.

+0

발렌틴은 처음에 내가 추측했다. 나는 어쨌든 세부 사항을 제공하기 위해 이것을 반대했다. 감사. – C4u

1

이 컴퓨터에는 C# 컴파일러가 없지만 아마도 anonymus 형식의 Iterable이 있으므로 발견 할 수 있습니다. anon.Select(x => x).Where(x => x.Var1 == 25).First() 또는 을 사용해보세요. 또한 선택이 필요 없다고 확신합니다. anon.Where(x => x.Var1 == 25).First()