2010-01-16 4 views
0

나는 while (true) 루프에서 처리중인 위도/경도 좌표 목록을 가지고 있습니다. 루프가 진행되는 동안 처리를 위해 원격 서비스로 전송되는 쿼리를 작성하고 있습니다. 원격 서비스는 12 쌍의 위도/경도 좌표 만 수락 할 수 있지만 목록에 수천 개가 포함될 수 있습니다. 내가하고 싶은 것은 질의를 작성한 다음 매 12 루프를 처리하기 위해 그것을 전송하는 것입니다.이 C# 루핑 및 처리 코드를 수정하는 방법은 무엇입니까?

List<string[]> lList = FromDB(); 

int i = 0; 
int intLastIndex - lList.Count; 
string strQuery = String.Empty 

while(true) 
{ 
    strQuery = lList[i][0] + "|" + lList[i][1]; 

    if(((i % 11) == 0) && (i != 0)) 
    { 
     SendToRemoteService(strQuery); 
     strQuery = String.Empty; 
    } 

    if(i == intLastIndex) 
    { 
     break; 
    } 

    i++ 
} 

그러나 이것은 범위를 벗어나는 배열을 생성하며 모든 레코드를 처리하지 않습니다. 누구든지 더 나은 접근법을 제안 할 수 있습니까?

마크

답변

8

, 당신은 그것을 다시 작성해야합니다

List<string[]> lList = FromDB(); 
List<string> query = new List<string>(); 
for(int i = 0; i < lList.Count; i++) 
{ 
    query.Add(lList[i][0] + "|" + lList[i][1]); 

    if((((i + 1) % 12) == 0) || (i == (lList.Count - 1))) 
    { 
     SendToRemoteService(String.Join("|", query.ToArray())); 
     query.Clear(); 
    } 
} 

그러나 당신은으로 업그레이드 할 경우 C# 3.0 당신을 System.Linq를 사용할 수 있습니다 일명 Linq에 - 투 - 객체 이는 코드를 단순화합니다. 당신이 요청에 따라 한 쌍을 보낼 것입니다 상상, 다음 코드는 다음과 같습니다

List<string[]> lList = FromDB(); 
var queries = lList 
    .Select((latlon, index) => new { latlon, index }) 
    .GroupBy(item => item.index/12, item => item.latlon) 
    .Select(group => String.Join("|", 
     group.Select(latlon => String.Format("{0}|{1}", latlon[0], latlon[1])) 
       .ToArray() 
    )); 
foreach(var query in queries) 
{ 
    SendToRemoteService(query); 
} 

코드 스타일 참고 :

List<string[]> lList = FromDB(); 
var queries = lList 
    .Select(latlon => String.Format("{0}|{1}", latlon[0], latlon[1])); 
foreach(var query in queries) 
{ 
    SendToRemoteService(query); 
} 

지금 12쌍 그룹으로 그룹화 많은 사람들이 오히려 query을 사용 변수 이름으로 strQuery 대신.

+0

언제든지 다른 버그를 볼 수 있습니다. –

+0

이 경우 TDD를 사용해야합니다.) –

+0

GroupBy 문을 사용하면 메모리에 모든 데이터가 저장됩니다 (메모리를 관리해야 함) – Maghis

3

당신이

int intLastIndex - lList.Count; 

을하려면 다음과 같이 변경을 할 경우 [] 접근은 0에서 시작되는 동안 목록에있는 항목의 총 수를 반환합니다 카운트 기능이 너무 목록이 작동합니다
int intLastIndex = lList.Count == 0 ? 0 : lList.Count-1; 
+1

당신도 맞습니다. 그의 코드에서 또 다른 실수를 발견했습니다 –

+2

길이가 0 일 때만 코드를 수정하면 예외가 발생하지 않습니다 –

+0

문제는 라인이 아니며 문제는 'while (true)'입니다. ,'while (i

3

종료 후 strQuery가 비어 있지 않으면 루프 뒤에 최종 "SendToRemoteService"호출이 필요합니다. 난 당신의 코드에서 적어도 5 개 버그를 발견

+0

맞습니다. 코드에서 또 다른 실수를 발견했습니다. –

+0

좋은 답변입니다. 내가 linq 솔루션을 시도 생각했지만, 나는 아직도 너무 녹색이야. – Daver

관련 문제