2011-09-20 3 views
5

반복 루프 대신 LINQ를 사용하는 경우 good practice LINQ를 사용하도록이 코드를 수정할 수 있습니까?LINQ를 사용하도록 해당 코드를 전환하는 방법

List<string> priorsLstIDs = ServiceUtil.extractColumnValuesAsStringVals(tqrPriors,Helper.STUDY_ID); 
List<DateTime> priorsLstDates = ServiceUtil.extractColumnValuesAsDateTimeVals(tqrPriors, "STUDY_DATE"); 
List<PriorElemSt> priorsElemLst = new List<PriorElemSt>(priorsLstIDs.Count); 

PriorElemSt elem; 

for (int i = 0; i < priorsLstIDs.Count; i++) 
{ 
    elem = new PriorElemSt(priorsLstIDs[i], priorsLstDates[i]); 
    priorsElemLst.Add(elem); 
} 

return filterStudyPriors(priorsElemLst); 

감사합니다.

업데이트 :filterStudyPriors() 메서드 호출은 LINQ의 일부가 될 수 있습니까?

+4

좋은 습관을 읽었으므로 전환하지 마십시오. 예를 들어 타이트한 루프에서는 반복 코드가 훨씬 빠릅니다. –

+3

나는 추가 할 것이다. 어떤 경우 반복 루프는 다른 사람들이 수정하는 것이 훨씬 간단합니다. 네가 망치를 가지고 있기 때문에 모든 것을 손톱으로 만들지 마라. – rerun

+0

전적으로 동의합니다 –

답변

8
IEnumerable<PriorElemSt> priorsElemLst = priorsLstIDs.Select((s,i) => new PriorElemSt(s, priorsLstDates[i])); 
return filterStudyPriors(priorsElemLst); 
+0

서명은 IEnumerable입니다. Delashmate

+0

@Delashmate : 내 대답의 두 번째 부분이 더 적합합니다. – abatishchev

+0

이것은 컴파일되지 않을 것입니다. 대답은'i'는 문자열이지만리스트로 인덱스로 전달하려면 정수 여야합니다. –

4

당신은 위의 문 i에서 Zip 방법을

var priorsElemLst = priorsLstIDs.Zip(
    priorsLstDates, (i, d) => new PriorElemSt(i, d)) 

를 사용하는 것은 priorsLstIds 및 d priorsLstDates에서 항목에서 항목입니다. 그들은 목록에서 자신의 위치를 ​​사용하여 함께 압축됩니다.

2

성능 손실에 대한 가독성이 향상된다고 생각되는 경우에만 최선의 방법은 아닙니다.

LINQ-to-Objects는 일반적으로 몇 가지 한계 오버 헤드 (다중 반복자 등)를 추가합니다. 아직 루프를 수행해야하고, 원용을 위임 가지고 있으며, 일반적으로 등

Is a LINQ statement faster than a 'foreach' loop?

4

당신은 그래서 같은 Enumerable.Range 방법을 사용할 수 있습니다 캡처 변수에서 얻을 수있는 몇 가지 여분의 역 참조해야 할 것 :

//first get the range of indexes 
var range = Enumerable.Range(0, priorsLstIDs.Count); 
//now project a list of elements at each index 
var priorsElemLst = range.Select(i => new PriorElemSt(priorsLstIDs[i], priorsLstDates[i])).ToList(); 
관련 문제