2010-01-16 83 views
0

我有一個Lat/Lon座標列表,我在while(true)循環中處理。在循環過程中,我構建了一個查詢,該查詢將被髮送到遠程服務進行處理。遠程服務只能接受12對Lat/Lon座標,但是我的列表可能包含數千個座標。我想要做的是構建查詢,然後發送它每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

我發現在你的代碼至少5級的錯誤,你應該把它改寫爲:

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 => String.Format("{0}|{1}", latlon[0], latlon[1])); 
foreach(var query in queries) 
{ 
    SendToRemoteService(query); 
} 

現在分組到12雙組:

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); 
} 

代碼風格注:很多人寧願使用query作爲變量名而不是strQuery

+0

每當我覺得我的權利,我看到另一個bug – 2010-01-17 02:28:42

+0

我們應該使用TDD這個=) – 2010-01-17 02:29:21

+0

通過使用GroupBy語句,你將有所有的數據在內存中(照顧你的內存;)) – Maghis 2010-01-17 02:33:21

3

COUNT函數將返回列表項的總數,而[]訪問從0開始,因此,如果您做如下改變

int intLastIndex - lList.Count; 

列表將工作
int intLastIndex = lList.Count == 0 ? 0 : lList.Count-1; 
+1

你是對的,我發現在他的代碼,另一個錯誤太孤單你 – 2010-01-16 22:58:04

+2

修正不會阻止一個異常時,長度爲0 – 2010-01-16 23:11:36

+0

問題並不行,問題是',而(真)'事,它必須由'while(i 2010-01-16 23:24:06

3

如果退出後strQuery不爲空,您還需要在循環後執行最後的「SendToRemoteService」調用。

+0

你是對的,我在他的代碼中發現了另一個錯誤 – 2010-01-16 22:55:49

+0

好的答案。我正在考慮嘗試linq解決方案,但我仍然太綠。 – Daver 2010-01-16 23:31:07