在 C# 中遍历列表<list<object>>

Traversing through list<list<object>> in C#

我有一个基础 class 喜欢:

  public class Data
  {
    public double F{ get; set; }
    public double S11R { get; set; }
    public double S21R { get; set; }
    public double S12R { get; set; }
    public double S22R { get; set; }
    public double S11I { get; set; }
    public double S21I { get; set; }
    public double S12I { get; set; }
    public double S22I{ get; set; }
 }

我也有一个class喜欢:

public class VTM
{
    public VTM()
    {
        Data = new List<List<Data>>();
    }

    public List<List<Data>> Data{ get; set; }
}

我创建了一个 VTM 实例,其中有 9 个列表(假设它们是 A、B、C、D、....、I),每个列表有 45 个数据实例。

基于此 class,我需要通过遍历每个元素来创建另一个 class。我想填充 VM class 的 SLCTN11 属性,这是下面定义的另一种类型 class。

public class VM
{
    public VM()
    {
        SLCTN11= new List<VMData>();
        SLCTN12= new List<VMData>();
        SLCTN21= new List<VMData>();
        SLCTN22= new List<VMData>();
      
    }
    public List<VMData> SLCTN11{ get; set; }
    public List<VMData> SLCTN12{ get; set; }
    public List<VMData> SLCTN21{ get; set; }
    public List<VMData> SLCTN22{ get; set; }
}



public class VMData
{
    public double F{ get; set; }
    public double R1 { get; set; }
    public double R2 { get; set; }
    public double R3 { get; set; }
    public double R4 { get; set; }
    public double R5 { get; set; }
    public double R6 { get; set; }
    public double R7 { get; set; }
    public double R8 { get; set; }
    public double R9 { get; set; }
    public double I1 { get; set; }
    public double I2 { get; set; }
    public double I3 { get; set; }
    public double I4 { get; set; }
    public double I5 { get; set; }
    public double I6 { get; set; }
    public double I7 { get; set; }
    public double I8 { get; set; }
    public double I9 { get; set; }
}

SLCTN11 是根据 A,B,C,..,I 填充的,每行由 45 行组成。 SLCTN11定义如下:

Vm vm=new VM();

vm.SCLTN11.Add(new VMData(){
   F=A.Data.F,
   R1=A.Data.S11R,
   I1=A.Data.S11I,
   R2=B.Data.S11R,
   I2=B.Data.S11I,
   ...,
   R9=I.Data.S11R,
   I9=I.Data.S11I 

});

我想通过两个 foreach 遍历 VTM 对象来完成它。

foreach (var dt in vna.Data)
{
   //iterates from A to I
   foreach (var data in dt)
   {
       //iterates through 0 to 45 Data objects 
   }
}

但是在 A 的迭代之后,我不确定如何处理将同一个 SLCTN11 对象从 B 更改为 I 的迭代,以像上面的定义那样填写 SCLTN11 列表。

提前致谢。

由于您只提供了 SCLTN11 的第一项应该是什么样子,所以想出一个通用的模式并不容易。但是,根据 vna.Data 的维度和 vm.SCLTN11 的预期维度,我想我设法理解了你想要实现的目标。如果我没记错的话,您需要 SCLTN11 的第一项由 A、B、...、I 集合中仅第一项的 S11RS11I 值组成。对于第二项,您需要 A、B、...、I 集合中所有第二项的 S11RS11I 值。等等。如果这是您想要的,则无法使用 foreach 循环轻松实现。但是,您可以轻松地使用带索引的 for 循环来完成它。

for (int i = 0; i < 45; i++)
{
    var data = new VMData
    {
        F = vna.Data[0][i].F
    };

    for (int j = 0; j < 9; j++)
    {
        var rProperty = typeof(VMData).GetProperty("R" + (j + 1));
        var iProperty = typeof(VMData).GetProperty("I" + (j + 1));

        rProperty.SetValue(data, vna.Data[j][i].S11R);
        iProperty.SetValue(data, vna.Data[j][i].S11I);
    }

    vm.SLCTN11.Add(data);
}

这里我用反射设置了R1R2、...、R9I1I2、.. ., I9 属性。但是,如果反射性能有问题,您可以省略内部循环并手动设置属性:

for(int i = 0; i < 45; i++)
{
    vm.SCLTN11.Add(new VMData
    {
        F = vna.Data[0][i].F, // Always A.F

        R1 = vna.Data[0][i].S11R,
        I1 = vna.Data[0][i].S11I,

        R2 = vna.Data[1][i].S11R,
        I2 = vna.Data[1][i].S11I,

        // ...
    });
}