Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему список (List<>) меняется сам по себе? Явно его никто не меняет, но он меняется 
V
    Опции темы
Cinot
  Дата 16.12.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 20.11.2008

Репутация: нет
Всего: нет



Столкнулся с такой вот непонятной для себя проблемой: имеется список, дальше производятся какие-то действия, где этот список используется (скажем, просто упомянается), в результате чего этот самый главный список меняет свои значения! Как, почему это происходит и как сохранить первоначальное значение неизменным?

Вот набросал небольшой код-примерчик:

Код

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Collections;


namespace Temp2
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

            List<string> list1 = new List<string>() { "1", "2", "3" };
            List<string> list2 = new List<string>() { "a", "b", "c", "d", "e" };
            List<string> list3 = new List<string>() { "14r", "22g", "31f", "4f" };
            List<IEnumerable> main_list = new List<IEnumerable>();
            main_list.Add(list1);
            main_list.Add(list2);
            main_list.Add(list3);



            List<IEnumerable> other_list = new List<IEnumerable>();
            int[] count = new int[] { 0, 2 };// массив номеров нужных элементов списка main_list
            //Добавляем в other_list нужные списки из главного списка main_list:
            for (int j = 0; j < count.Length; j++)
            {
                other_list.Add(main_list[count[j]]);
            }

            //Создаём список other_list_new, содержащий списки только с первыми двумя значениями:
            List<IEnumerable> other_list_new = new List<IEnumerable>();
            foreach (List<string> item in other_list)
            {
                item.RemoveRange(2, (item.Count - 2));
                other_list_new.Add(item);
                item.Clear();// Вот в этом месте почему-то изменяется main_list, хотя его никто не менял
            }

        }

    }
}


user posted image
user posted image
user posted image
PM MAIL   Вверх
CYBERDREAM
Дата 16.12.2010, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 8
Всего: 28



у тебя обе колекции ссылаются на одни и те же объекты, поэтому когда модифицируешь их, меняются в обоих коллекциях


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
Cinot
Дата 16.12.2010, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 20.11.2008

Репутация: нет
Всего: нет



Но как исправить ситуацию? Как более грамотно написать?
PM MAIL   Вверх
CYBERDREAM
Дата 16.12.2010, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 8
Всего: 28



забивать разные объекты (клонировать)


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
KelTron
Дата 16.12.2010, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



Вызови метод ToList(), он создаст копию списка, она и будет помещена в other_list
Код

for (int j = 0; j < count.Length; j++)
            {
                other_list.Add(main_list[count[j]].ToList());
            }



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Cinot
  Дата 16.12.2010, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 20.11.2008

Репутация: нет
Всего: нет



Цитата(CYBERDREAM @  16.12.2010,  13:07 Найти цитируемый пост)
забивать разные объекты (клонировать)

Если Вас не затруднит, можете привести небольшой пример на основе части кода примера?
Цитата(KelTron @  16.12.2010,  13:19 Найти цитируемый пост)
Вызови метод ToList(), он создаст копию списка, она и будет помещена в other_list

Ошибка    1    "System.Collections.IEnumerable" не содержит определения для "ToList" и не был найден метод расширения "ToList", принимающий тип "System.Collections.IEnumerable" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)

PM MAIL   Вверх
CYBERDREAM
Дата 16.12.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 8
Всего: 28



Код

/// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
private static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());

    var list1 = new List<string> {"1", "2", "3"};
    var list2 = new List<string> {"a", "b", "c", "d", "e"};
    var list3 = new List<string> {"14r", "22g", "31f", "4f"};
    var main_list = new List<IEnumerable<String>> {list1, list2, list3};


    var other_list = new List<IEnumerable>();
    var count = new[] {0, 2}; // массив номеров нужных элементов списка main_list
    //Добавляем в other_list нужные списки из главного списка main_list:
    for (int j = 0; j < count.Length; j++)
    {

        other_list.Add(new List<String>(main_list[count[j]]));
    }

    //Создаём список other_list_new, содержащий списки только с первыми двумя значениями:
    var other_list_new = new List<IEnumerable>();
    foreach (List<string> item in other_list)
    {
        item.RemoveRange(2, (item.Count - 2));
        other_list_new.Add(item);
        item.Clear(); // Вот в этом месте почему-то изменяется main_list, хотя его никто не менял
    }
}



--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
Cinot
Дата 16.12.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 20.11.2008

Репутация: нет
Всего: нет



Большое спасибо за внесённую ясность!
PM MAIL   Вверх
KelTron
Дата 16.12.2010, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



Цитата(Cinot @  16.12.2010,  14:19 Найти цитируемый пост)
Ошибка    1    "System.Collections.IEnumerable" не содержит определения для "ToList" и не был найден метод расширения "ToList", принимающий тип "System.Collections.IEnumerable" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)

Ну using System.Linq; ессно надо.


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0747 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.