【问题标题】:How to iterate through two dimensional array如何遍历二维数组
【发布时间】:2011-07-18 17:07:08
【问题描述】:

我有两个列表,我将它们转换为单个二维数组,如下所示:

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

正如您在第一行中看到的,电压和电流都是相同的值,即电压,而在第二行中,它们再次相同,但这次是电流值。我该如何解决这个问题?

【问题讨论】:

  • 请出示您用于打印的代码。此外,如果您可以显示数组中的值,那也可能会有所帮助。
  • 使用 for 作为填充。
  • 看起来 GetCurveDataForTestType 返回一个一维数组。请发布所有代码。
  • 请同时显示用于初始化电流和电压数组的代码。

标签: c# multidimensional-array foreach loops


【解决方案1】:

我建议不要为此使用多维数组。

相反,您可以像这样创建一个类:

class Measurement
{
    public double Voltage { get; set; }
    public double Current { get; set; }
}

并更改您的方法以返回IEnumerable&lt;Measurement&gt;。在 .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);
}

【讨论】:

  • 听起来不错,您介意提供更多信息吗?
  • @Sean87:如果您能提供您正在使用的 .NET 框架和/或 C# 版本的版本号,将会有所帮助。
  • 感谢您提供额外的代码,我正在使用 .NET 4 和 C# Express 2010 进行此操作
  • 但是我已经在一个类中,我不希望只为这个方法创建一个新类。有办法吗?
  • @Sean87:拥有一个只用于一两个方法的类并没有什么坏处——如果你想避免混淆命名空间,你可以把它变成一个内部类。或者,您可以使用匿名类型,但您不能(轻松)从方法中返回它。或者您可以使用Tuple&lt;double, double&gt; 而不是自定义类,但是您必须再次按索引引用成员。
【解决方案2】:

您使用与创建数组时相同的循环:

for (int i = 0; i < data.GetLength(0); i++) {
  richTextBox1.AppendText("Voltage" + data[i, 0] + "    ---------    ");
  richTextBox1.AppendText("Current" + data[i, 1] + "\r\n");
}

【讨论】:

  • 感谢这解决了我目前的问题,但我想试试那个类方法。
【解决方案3】:

更新: 这个问题似乎与How to foreach through a 2 dimensional array? 重复。链接的答案有一个替代解决方案,可以通过从二维数组切换到数组数组来使用 foreach。


foreach 带有一个二维数组,将按顺序返回数组中的每个双精度值(按设计)。

例如,给定以下二维双精度数组:

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 循环。

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 2016-09-04
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多