C# Pascal Код треугольника не работает - Logi c правильно - PullRequest
1 голос
/ 09 июля 2020

Я пытался узнать больше о C#, поэтому я немного практиковался со списками:

static void Main()
    {
        List<List<int>> a = new List<List<int>>();
        List<int> temp = new List<int>();
        temp.Add(1);
        a.Add(temp);
        for (int i = 0; i < 9; i++)
        {
            temp.Clear();
            temp.Add(1);
            for (int q = 0; q < a[i].Count-1; q++)
            {
                temp.Add(a[i][q] + a[i][q+1]);
            }
            temp.Add(1);
            a.Add(temp);
        }
        foreach (var i in a[8])
            Console.Write(i + " ");
        Console.WriteLine();
    }

Я преобразовал это в C ++, и он отлично работает. Однако в C# a [i] .Count равно всегда 1. Хотя после первого l oop размер должен быть 2.

Я могу только предположить, что есть некоторое существенное различие между вектором C ++ и списком C#, которое я, по-видимому, пропустил. Есть идеи?

Вот работающий код C ++:

int main()
{
    std::vector<std::vector<int>> a;
    std::vector<int> b;
    b.push_back(1);
    a.push_back(b);
    for (int i = 0; i < 9; i++)
    {
        b.clear();
        b.push_back(1);
        for (int q = 0; q < a[i].size()-1; q++)
        {
            b.push_back(a[i][q] + a[i][q+1]);
        }
        b.push_back(1);
        a.push_back(b);
    }
    for (auto i : a[8])
    {
        std::cout << i << ' ';
    }
}

Вывод для кода C ++:

1 8 28 56 70 56 28 8 1

Вывод для C# Код:

1 1

Любая помощь приветствуется, спасибо!

Ответы [ 2 ]

4 голосов
/ 09 июля 2020

Посмотрите на свой C# код a.Add(temp);. Эта переменная temp является ссылочным типом, поэтому она всегда будет добавлять один и тот же объект памяти.

Чтобы исправить это, вы можете использовать LINQ для решения этой проблемы: a.Add(temp.ToList());. ToList() создаст новый объект с другой памятью.

1 голос
/ 09 июля 2020

Я немного изменил ваш код, основное отличие состоит в том, что C# в основном бывает двух типов: один является ссылочным типом, а другой - типом значения. Список - это справочный тип. В вашем коде вы всегда очищаете и добавляете числа во временный список. который всегда указывает на один и тот же объект, поэтому, когда вы очищаете n-ю строку, он также очищает все строки перед ним.

    List<List<int>> a = new List<List<int>>();

    a.Add(new List<int> { 1 });
    for (int i = 0; i < 9; i++)
    {
        List<int> temp = new List<int>();
        temp.Add(1);
        for (int q = 0; q < a[i].Count - 1; q++)
        {
            temp.Add(a[i][q] + a[i][q + 1]);
        }
        temp.Add(1);
        a.Add(temp);
    }
    foreach (var row in a)
    {
        foreach (var col in row)
        {
            Console.Write(col + " ");
        }

        Console.WriteLine();
    }

    Console.ReadKey();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...