我有两个列表,我将它们转换为单个二维数组,如下所示:
double[,] data = new double[voltage.Count(), 2];
for (int i = 0; i < voltage.Count(); i++)
{
data[i, 0] = voltage[i];
data[i, 1] = current[i];
}
现在我试图通过这个数组进行迭代,但我得到的是每行中电压和电流的相同值:
foreach (double data in ztr.GetCurveDataForTestType()) //this will return my array
{
richTextBox1.AppendText("Voltage" + data + " --------- ");
richTextBox1.AppendText("Current" + data + "\r\n");
}
电压-0.175 ---------电流-0.175
电压-9.930625E-06 ---------电流-9.930625E-06
电压-0.171875 ---------电流-0.171875
电压-9.53375E-06 ---------电流-9.53375E-06
电压-0.16875 ---------电流-0.16875
正如您在第一行中看到的那样,电压和电流都是相同的电压值,而在第二个原始电压上,它们又是相同的,但这次它是当前值。我该如何解决这个问题?
答案 0 :(得分:2)
我建议不使用多维数组。
相反,你可以创建一个这样的类:
class Measurement
{
public double Voltage { get; set; }
public double Current { get; set; }
}
并更改您的方法以返回IEnumerable<Measurement>
。在.NET 4.0中,您可以使用Zip
:
public IEnumerable<Measurement> GetCurveDataForTestType()
{
return voltage.Zip(current,
(v, c) => new Measurement { Voltage = v, Current = c});
}
对于旧版本的.NET:
public IEnumerable<Measurement> GetCurveDataForTestType()
{
for (int i = 0; i < voltage.Count(); i++)
{
yield return new Measurement
{
Voltage = voltage[i],
Current = current[i]
};
}
}
然后您的代码变为:
foreach (Measurement data in ztr.GetCurveDataForTestType())
{
richTextBox1.AppendText(
"Voltage: {0} --------- Current: {1}", data.Voltage, data.Current);
}
答案 1 :(得分:1)
使用与创建数组时相同的循环:
for (int i = 0; i < data.GetLength(0); i++) {
richTextBox1.AppendText("Voltage" + data[i, 0] + " --------- ");
richTextBox1.AppendText("Current" + data[i, 1] + "\r\n");
}
答案 2 :(得分:0)
<强>更新强> 此问题似乎与How to foreach through a 2 dimensional array?重复。链接的答案有一个替代解决方案,可以通过从二维数组切换到数组数组来使用foreach。
foreach
将按顺序返回数组中的每个double值(按设计)。
例如,给定以下二维二维数组:
var array = new double[,] { { 0, 1, }, { 2, 3 }, { 4, 5 } };
foreach (var d in array)
{
Console.WriteLine(d);
}
您将获得以下控制台输出:
0
1
2
3
4
5
因此,foreach不适合您的需求。您应该使用for
循环。