在 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 集合中仅第一项的 S11R
和 S11I
值组成。对于第二项,您需要 A、B、...、I 集合中所有第二项的 S11R
和 S11I
值。等等。如果这是您想要的,则无法使用 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);
}
这里我用反射设置了R1
、R2
、...、R9
和I1
、I2
、.. ., 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,
// ...
});
}
我有一个基础 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 集合中仅第一项的 S11R
和 S11I
值组成。对于第二项,您需要 A、B、...、I 集合中所有第二项的 S11R
和 S11I
值。等等。如果这是您想要的,则无法使用 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);
}
这里我用反射设置了R1
、R2
、...、R9
和I1
、I2
、.. ., 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,
// ...
});
}