динамично добавяне на масив в списък от масиви


0

Колеги, моля за малко помощ, че гугъл се оказа малък.

Имам следната ситуация:

едномерен масив, който променя стойностите на елементите си и след всяка промяна искам да се добави в списък от масиви. Проблемът е, че когато добавя първия масив към списъка и започна да въвеждам нови стойности за елементите на масива, то се променят и стойностите на записаните в листа масиви. Това е съвсем логично, защото става дума за референтни типове. Пробвах при List.Add за задам Clone напр. myList.Add(myArr.Clone());обаче ми го подчертава. Как се процедира в този случай?

Моля за помощ, че е за домашното и днес трябва да го предам!

 static void Main()
    {
        Random rnd = new Random();
        List<int[]> myList = new List<int[]>();
        int[] myArr = new int[3];
        for (int j = 0; j < 10; j++)
        {
            for (int i = 0; i < myArr.Length; i++)
            {
                myArr[i] = rnd.Next(1, 100);
            }

            myList.Add(myArr);
        }

    }



Отговори



2

Аз бих направил:

myList.Add(myArr.Clone() as int[]);

myList.Add(myArr.ToList().ToArray()); е малко хардкор сякаш :D

Обаче не съм сигурен дали клонирането е по-добро от създаването на нова инстанция и копирането в нея, но със сигурност е по-елегантно.


от VGeorgiev (2890 точки)


0
best answer. точно за това е направен Array.Clone()

от staafl (5770 точки)


1
Не е много правилно, но може да пробваш това:
myList.Add(myArr.ToList().ToArray());

от SVGN_H (3048 точки)


0
myList.Add(myArr.Skip(0).ToArray()) избягва междинния списък :-)

от staafl (5770 точки)


1

Може да пробваш ето това:

static void Main()
        {
            Random rnd = new Random();
            List<int[]> myList = new List<int[]>();
            int[] myArr = new int[3];
            for (int j = 0; j < 10; j++)
            {
                for (int i = 0; i < myArr.Length; i++)
                {
                    myArr[i] = rnd.Next(1, 100);
                }

                int[] copy = new int[myArr.Length];
                Array.Copy(myArr, copy, myArr.Length);
                myList.Add(copy);
            }

        }

Array.Copy, просто копира масива ти в друг такъв - http://www.dotnetperls.com/array-copy


от Teodor92 (13062 точки)


0
Понеже в списъка има еднакви масиви искам да ги премахна. За целта мислех че това ще работи: List

от ttitto (1950 точки)


0
Направи един метод, който сравнява два масива, елемент по елемент.
for(int i=0; i < myDistList.Count; i++) { for(int j=i+1;j< myDistList.Count; j++) { if (EqualArrays(myDistList[i], myDistList[j])) { // запиши в един списък индексите на повтарящите се масиви и после ги изтрии } } }

от SVGN_H (3048 точки)

0
в .NET вече съществува такъв метод: SequenceEqual (using System.Linq)

от staafl (5770 точки)