2013-09-06 2 views
4

처리를 추적하기 위해 ef 객체 목록에 추가 매개 변수를 추가하려고하지만 각 목록 항목을 명시 적으로 초기화하지 않아도 계속 실행됩니다. 이 작업을 수행하는 올바른 linq 방법은 무엇입니까? 간결함과는 별도로이 경우 linq 구문에 이점이 있습니까?객체 목록을 반복하지 않고 튜플 목록으로 변환

List<app_subjects> subjectList = AppMySQLQueries.GetAllSubjects(); 
List<Tuple<app_subjects, bool>> subjectCollection = new List<Tuple<app_subjects, bool>>(subjectList.Count); 

foreach (app_subjects subject in subjectList) 
{ 
    subjectCollection.Add(Tuple.Create(subject, false)); 
} 

나는이 사이트를 성공적으로 검색했다.

+0

'LINQ'는 이것을 할 수 있지만 전통적인'for' 또는'foreach'와 매우 유사합니다. –

+2

LINQ도 반복을 수행합니다. * (내부적으로) * – Habib

+0

@Habib LINQ를 사용하면 작업 실행을 연기 할 수 있습니다. – Servy

답변

10

당신은 단지 소스 컬렉션의 각 요소에 람다 식의 변형을 적용 여기에 투사 (Select)를 사용하고 싶습니다.

List<Tuple<app_subjects, bool>> tuples = subjectList.Select(x => new Tuple<app_subjects, bool>(x, false)).ToList(); 

ToList() 전화는 당신이 그것을 제거한 경우 다음 방법은 IEnumerable<Tuple<app_subjects, bool>>를 반환합니다 완전히 필요가 없습니다. 나중에 튜플 집합을 반복하려고한다면 ToList 호출은 실행을 강제하기 때문에 제거되어야하고 (IEnumberable을 열거한다) 다음 작업 (foreach)은 코드를 더 나쁘게 만든다.

+0

람다 "x.subject"는 클래스 자체가 아니라 ef 클래스의 메소드로 해석되기 때문에 유효하지 않습니다. – aldosa

+1

@AldoSalzberg 예, 편집을했습니다. 나는'app_subject'가'subjectList' 컬렉션에있는 객체의 속성이라고 생각했습니다. 사실 그것은 단지'List evanmcdonnal

+0

위의 설명을 가져 주셔서 감사합니다. 그건 의미가 있습니다. – aldosa

5

좋아요?

subjectList.Select(s => Tuple.Create(s, false)).ToList(); 
0

시도해보십시오.

List<Tuple<app_subjects, bool>> subjectCollection = subjectList.CovertAll(subject => new Tuple<app_subjects, bool>(){ 
subject, 
false 
}).ToList(); 
+0

죄송합니다. 새 튜플이 아닌 Tuple.Create (...)이어야합니다. – aldosa

관련 문제