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

本文关键字:linq double for 循环 更改 | 更新日期: 2023-09-27 18:04:49

我想为二维List写这样的双for loop,它抛出了一个错误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;
        }
    }
}

以下是PositionList, pairListAddTwoList已存在列表的代码:

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();

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

So

  1. 至于使用linq来更新对象- linq是用于查询而不是更新,所以除非你想在if语句中创建新对象,否则linq不是方向。
  2. 至于你的错误cannot be assigned to it is read only -你正在使用的对象集合是由linq生成的,是一个匿名类型的集合。匿名类型的属性是read-only ,这解释了错误。

不进入你的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;
        }
    }
}