2010-01-16 45 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