比较列表中的两个项目,然后在索引处拆分为较小的列表

时间:2018-11-22 22:18:36

标签: c#

所以我有一个位置列表。如果每个位置之间的距离大于30,则需要拆分列表。

我可以遍历列表并获得每个位置之间的距离,我只是不确定分割列表的最佳方法是什么,我已经阅读了将列表分成一定大小的答案的答案,但是在我看来情况下,大小可能会根据位置之间的距离而变化。

这可能非常简单,我看不到。我到目前为止的内容在下面,代码在比较这两项时非常简单,将我所停留的列表完全分开。目前,我的代码不会包含原始列表中的所有项目,而是会排除第一个GetRange之前的项目。

var unkownSegments = grouped.Where(x => x.ActivityType == null);

foreach (var group in unkownSegments)
{
   var tempLists = new List<List<LocationResult>>();
   for (int i = 0; i < group.Items.Count - 1; i++)
   {
      var point1 = group.Items[i];
      var point2 = group.Items[i + 1];

      var sCoord = new GeoCoordinate(point1.Lat, point1.Long);
      var eCoord = new GeoCoordinate(point2.Lat, point2.Long);

      var distance = sCoord.GetDistanceTo(eCoord);

      if(distance > 30)
      {
         var tempList = group.Items.GetRange(i, group.Items.Count - i);
         tempLists.Add(tempList);
      }
   }
}

感谢您的帮助或建议。

1 个答案:

答案 0 :(得分:1)

要创建范围(使用GetRange()方法),您需要知道它的开始位置和结束位置。如果Item[i]Item[i+1]之间的距离大于30,则您知道 end ,因为该 end 位于索引{{ 1}}。但是您不知道开始(当然,您在第一个范围内就知道它-i),因为开始取决于前一个范围的结束。因此,您需要引入新的变量(在我的示例中称为0),其中将包含此类信息。它从值rangeStart开始(这是第一个范围始终开始的位置),然后在您添加新范围时更新它的值(下一个范围始终从索引0开始)。

i+1循环结束后,将保留一些点。因此需要将它们添加为最后一个范围。整个方法如下所示:

for