如何解决这个C#循环和处理代码?
我有一个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++
}
但是,这会生成一个数组越界的异常,并且不会处理所有记录。任何人都可以提出更好的方法?
马克
我发现在你的代码至少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
。
COUNT函数将返回列表项的总数,而[]访问从0开始,因此,如果您做如下改变
int intLastIndex - lList.Count;
要
列表将工作int intLastIndex = lList.Count == 0 ? 0 : lList.Count-1;
你是对的,我发现在他的代码,另一个错误太孤单你 – 2010-01-16 22:58:04
修正不会阻止一个异常时,长度为0 – 2010-01-16 23:11:36
问题并不行,问题是',而(真)'事,它必须由'while(i
如果退出后strQuery不为空,您还需要在循环后执行最后的“SendToRemoteService”调用。
你是对的,我在他的代码中发现了另一个错误 – 2010-01-16 22:55:49
好的答案。我正在考虑尝试linq解决方案,但我仍然太绿。 – Daver 2010-01-16 23:31:07
每当我觉得我的权利,我看到另一个bug – 2010-01-17 02:28:42
我们应该使用TDD这个=) – 2010-01-17 02:29:21
通过使用GroupBy语句,你将有所有的数据在内存中(照顾你的内存;)) – Maghis 2010-01-17 02:33:21