Как перебрать двумерный массив - PullRequest
0 голосов
/ 19 марта 2011

У меня есть два списка, которые я конвертирую в один двухмесячный массив, например:

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
Voltage-0.16875 --------- Current-0.16875

Как видно, в первой строке напряжение и ток имеют одинаковое значение напряжения, а во второй строке -опять то же самое, но на этот раз это текущее значение.Как я могу это исправить?

Ответы [ 3 ]

2 голосов
/ 19 марта 2011

Я бы рекомендовал , а не , используя для этого многомерные массивы.

Вместо этого вы можете сделать класс примерно таким:

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 голос
/ 19 марта 2011

Вы используете тот же тип цикла, что и при создании массива:

for (int i = 0; i < data.GetLength(0); i++) {
  richTextBox1.AppendText("Voltage" + data[i, 0] + "    ---------    ");
  richTextBox1.AppendText("Current" + data[i, 1] + "\r\n");
}
0 голосов
/ 19 марта 2011

Обновление: Похоже, что этот вопрос является дубликатом Как перейти через двумерный массив? .Связанный ответ имеет альтернативное решение, которое позволяет использовать 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.

...