1

我正在使用ForEach statement. 输出将如下所示...

Startingpoint | length
-----------------------
0             | 1
1             | 54.47
55.47         | 47.98 

所以长度是这样计算的......

length = *next item starting point - current item starting point

这是我想以伪代码式的外观做的事情。

foreach (DefectMap obj in dm)
{
     mdmList.Add(new ModifiedDefectMap()
        {                        
            StartingPoint = obj.Start,
            Length =  ValueOfNext().obj.Start - obj.Start

问题是,我无法知道"ValueOfNext().obj.Start"会发生什么,因为我处于foreach循环的当前迭代中。

4

5 回答 5

4

使用常规 for 循环

//Count-1 to stop at the second to last item
for(int i = 0; i < dm.Count-1; ++i)
{
      mdmList.Add(new ModifiedDefectMap()
      {                        
           StartingPoint = dm[i].Start,
           Length =  dm[i+1].Start - dm[i].Start
      });
}
于 2013-11-11T19:26:40.890 回答
3

你可以试试.Zip()声明。

mdmList = dm.Zip(dm.Skip(1), (current, next) => new ModifiedDefectMap
{
  StartingPoint = current.Start,
  Length = next.Start - current.Start
});

跳过偏移列表,因此您最终将所有相邻元素对映射到currentand next,然后使用它们创建对象。这样看起来还算干净。

于 2013-11-11T19:31:08.203 回答
1

如果您想一次访问多个项目,则最好使用for循环。

for(int i = 0; i < dm.Count-1; ++i)
{
      mdmList.Add(new ModifiedDefectMap()
      {                        
           StartingPoint = dm[i].Start,
           Length =  dm[i+1].Start - dm[i].Start
      }
}

如果您仍想使用 foreach循环,您可以使用IndexOf

于 2013-11-11T19:27:55.977 回答
1

我不确定您是否可以查看 a 中的下一个值,foreach但是,如果您正在执行这样的实现,我建议使用 for 循环来提供下一个值,请务必检查是否可能是下一个值在数组的范围内。

for(int i = 0; i < list.Length; i++)
{
     list[i] = random.Next();
     if(i+1 < list.Length)
     {
         list[i+1] = random.Next();
     }
}

请务必了解您需要 list 具有索引器([x] 数组表示法),因为某些集合没有索引器,例如 HashSet 或 Stack。

于 2013-11-11T19:29:53.907 回答
1

有几个选项建议自己。

  1. 使集合 ( dm) 成为一个链表,而不是任何它。然后你可以写

     while(obj.next != null)
     {
        var length =  obj.Next.Start - obj.Start;
        // whatever else you need to do in iteration
     }
    
  2. 为每个对象添加一个属性,命名Collection包含对集合的引用dm,以及另一个名为 的属性End

     public double? End // has to be nullable double to return null on last item
     { 
       get 
       { 
           var nDx = Collection.IndexOf(this);
           return Collection.Count > nDx+1?  Collection[nDx + 1].Start: (double?)null;
       }
     }
    
于 2013-11-11T19:36:48.117 回答