如何修复这个C#循环和处理代码?

时间:2010-01-16 22:17:58

标签: c# while-loop

我有一个Lat / Lon坐标列表,我正在处理一段时间(真实)循环。在循环期间,我正在构建一个将被发送到远程服务进行处理的查询。远程服务只能接受12对Lat / Lon坐标,但我的列表可能包含数千个。我想要做的是构建查询,然后发送它以便每12个循环处理一次。

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++
}

但是,这会生成一个数组超出范围的异常,并且不会处理所有记录。任何人都可以提出更好的方法吗?

标记

3 个答案:

答案 0 :(得分: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-to-objects,这将简化你的代码。想象一下,您希望每个请求发送一对,然后您的代码将是:

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作为变量名称。

答案 1 :(得分:3)

当[]访问者从0开始时,Count函数将返回列表中的项目总数,因此如果进行以下更改,列表将起作用

int intLastIndex - lList.Count;

int intLastIndex =  lList.Count == 0 ? 0 : lList.Count-1;

答案 2 :(得分:3)

如果在退出后strQuery不为空,那么在循环之后你还需要一个最后的“SendToRemoteService”调用。