我有一个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++
}
Run Code Online (Sandbox Code Playgroud)
但是,这会生成一个数组超出范围的异常,并且不会处理所有记录.有谁能建议更好的方法?
标记
我在您的代码中发现至少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();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果要升级到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);
}
Run Code Online (Sandbox Code Playgroud)
现在分组为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);
}
Run Code Online (Sandbox Code Playgroud)
代码风格注意:很多人宁愿使用query
而不是strQuery
变量名.