2012-01-18 2 views
1

데이터베이스에 저장된 역할 목록이 있으며 모델에 이러한 역할 중 하나만 있습니다. Entity Framework는 모델을 채우는 데 사용되지만 여기서는 중요하지 않다고 생각합니다.왜이 루프는 하나 이상의 반복을합니까?

코드 타격이 반복하는 데 사용할 것 같다

foreach (var role in (new Role[1]).Concat(model.Roles)) 
{ 
} 

하지만이 코드가 무엇을하고 있는지 내 인생 이해할 수없는 당신과 함께 정직합니다. 내가 아는 한 번만 두 번 반복됩니다. 아무도 그것이 무엇을하고 있는지 명확히 할 수 있습니까?

+1

왜 '신'을하고 있습니까? 'var temp = new Role [1]). Concat (model.Roles)'하고'temp '에 무엇이 들어 있는지 분석 해보았습니까? 'model.Roles'에는 하나의 객체 만 포함되어 있습니까? – ChrisF

+0

@ChrisF 안타깝게도 내 코드가 아니기 때문에 내가하는 일을 이해하지 못하기 때문에 묻습니다. 예, 데이터베이스에는 하나의 역할 만 표시됩니다. 네가 제안한 것을하는 것은 아마도 좋은 생각 일 것입니다. :-) – Firedragon

답변

6

new Role[1]은 단일 요소를 포함하는 배열을 만듭니다. 그 요소는 null입니다. Role이 아닌 것으로 간주하는 값 유형이 아니면. 그렇지 않으면 new Role()으로 전화하면됩니다.

그런 다음 null 역할을 연결하고 model.Roles에있는 역할과 연결하십시오. 결과적으로 nullmodel.Roles의 역할 모음 앞에 추가하는 것입니다. 그런 다음이 새 컬렉션을 반복합니다. model.Roles이 요소

을 포함

경우

{ role1, role2, role3 } 

foreach 루프

{ null, role1, role2, role3 } 
+0

고마워. 나는 지금 그것이하고있는 것을 이해할 수있다. 왜 그렇게 프로그래밍되었는지는 모르겠지만 결함은 분명합니다. – Firedragon

0

호출 연결은 두 배열 모두에서 반복자를 작성합니다. 그래서 2 개의 쿼리.

2

Concat 두 시퀀스를 연결을 반복합니다. 같은 그것은 꽤 많은 작품 : 다음 model.Roles이며 어떤

public static IEnumerable<T> Concat<T>(this IEnumerable<T> first, IEnumerable<T> second) 
{ 
    foreach(T item in first) 
    yield return item; 
    foreach(T item in second) 
    yield return second; 
} 

(new Role[1]).Concat(model.Roles) 따라서 하나 Role (new Role[1])의 배열을 만들어이 두 번째 다음에 첫번째의 순서를 반환, 그 경우는 null (하나 개의 기본 Role입니다 Role은 참조 유형 임) 다음 모두 model.Roles입니다.

+0

답해 주셔서 감사합니다. 나는 마틴의 대답을 받아 들일 것입니다. 처음에는 끝났지 만 위대한 답을 얻으려면 +1했습니다. – Firedragon

+0

두 가지 대답이 똑같이 좋은 것으로 보이는 좋은 방법입니다. –

관련 문제