更改double for循环中的值或使用linq

时间:2016-08-31 10:59:39

标签: c# linq

我想为二维for loop编写这样的双List,它会抛出错误cannot be assigned to it is read only然后如何修改它?(也许我们可以构建一个新变量,但是PositionList的类型非常复杂)顺便说一下,有一种简单的方法可以使用linq来更改List吗?

for (int i = 0; i < PositionList.Count - 1; i++)
{
    for (int j = 0; j < PositionList[i].Count; j++)
    {
        if (Math.Abs(PositionList[i][j].DesignPosition - PositionList[i][j].Position) < T)
        {
            PositionList[i][j].DesignPosition = PositionList[i][j].Position;
            PositionList[i + 1][j].Position = PositionList[i][j].DesignPosition;
        }
    }
}

以下是PositionListpairListAddTwoList已存在列表的代码:

var PositionList = pairList.GroupBy(o => o.pair.Item1.Date)
                 .Select(o =>
                 {
                     int Position = 0;
                     var SumPosition = AddTwoList.GroupBy(p => p.Key)
                                                 .Select(p => new {                    
                                                     DesignPosition = p.Sum(q => q.DesignPosition),
                                                     Position                    
                                                 }).ToList();
                     return SumPosition;
                 }).ToList();

1 个答案:

答案 0 :(得分:1)

所以

  1. 至于使用linq更新对象 - linq用于查询而不是更新,因此除非你想在if语句中创建新对象,否则linq不是方向。
  2. 关于cannot be assigned to it is read only的错误 - 您正在使用的对象集合由linq生成,是匿名类型的集合。 匿名类型的属性为read-only ,用于解释错误。
  3. 没有进入你的linq逻辑,最简单的解决方法是创建一个类,你的linq将初始化它的实例而不是匿名类型:

    public class YourClass
    {
        public int Position { get; set; }
        public int DesignPosition { get; set; }
    }
    
    var PositionList = pairList.GroupBy(o => o.pair.Item1.Date)
                               .Select(o => AddTwoList.GroupBy(p => p.Key)
                                                      .Select(p => new YourClass {                    
                                                          DesignPosition = p.Sum(q => q.DesignPosition),
                                                          Position = 0                   
                                                       }).ToList())
                               .ToList();
    
    for (int i = 0; i < PositionList.Count - 1; i++)
    {
        for (int j = 0; j < PositionList[i].Count; j++)
        {
            if (Math.Abs(PositionList[i][j].DesignPosition - PositionList[i][j].Position) < T)
            {
                PositionList[i][j].DesignPosition = PositionList[i][j].Position;
                PositionList[i + 1][j].Position = PositionList[i][j].DesignPosition;
            }
        }
    }