Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
3 / 3 / 1
Регистрация: 25.03.2014
Сообщений: 45
1

Единые значения для Dictionary и List

09.02.2015, 15:36. Показов 3810. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.

У меня есть словарь в нем будет храниться большое количество значений.
И есть List в лист из словаря я буду добавлять часть из этих значений делать с ними какие то действия.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            
            Dictionary<int, Planet> testOne = new Dictionary<int, Planet>();
 
 
            Planet planetOne = new Planet();
            planetOne.Name = "Vega";
 
            Planet planetTwo = new Planet();
            planetTwo.Name = "Mega";
 
            Planet planetThree = new Planet();
            planetThree.Name = "Beta";
 
            testOne.Add(0, planetOne);
            testOne.Add(1, planetTwo);
            testOne.Add(2, planetThree);


C#
1
2
3
4
5
6
            
            List<Planet> testTwo = new List<Planet>();
 
            testTwo.Add(testOne[0]);
            testTwo.Add(testOne[1]);
            testTwo.Add(testOne[2]);
Собственно вопрос когда я меняю значения в словаре и в листе они меняются для обоих, но если я удаляю объект из List или Dictionary они остаются там где я их не удалил.

Мне нужно чтобы значение было единым для всех если я его удалю из словаря его не стало в листе.
И для листа мне нужно иметь возможность удалить из лист не удаляя из словаря и удалить из листа и из словаря.

Как это делается что надо использовать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2015, 15:36
Ответы с готовыми решениями:

Сложный Dictionary<MyClass, Dictionary<List<MyClass2>, List<string>>> MyDictionary
Здравствуйте. Помогите plz реализовать обращения к словарю вида : Dictionary&lt;MyClass,...

Сериализация для Dictionary<DateTime, List<string>>
как сериализовать в XML Dictionary&lt;DateTime, List&lt;string&gt;&gt;?

Правильное использование и перебор для Dictionary<DateTime, List<string>>
Здравствуйте! есть Dictionary&lt;DateTime, List&lt;string&gt;&gt; datenote = new Dictionary&lt;DateTime,...

Sort list in Dictionary
У меня есть Dictionary, в котором ключом служат размеры файла в килобайтах, а значением листы с...

28
3 / 3 / 1
Регистрация: 25.03.2014
Сообщений: 45
09.02.2015, 16:39  [ТС] 21
Author24 — интернет-сервис помощи студентам
Я понял вас я просто про эти методы даже не слышал никогда ну щас почитаю пойму что к чему.
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
09.02.2015, 16:42 22
Цитата Сообщение от x5reunion Посмотреть сообщение
про эти методы даже не слышал никогда
Это не методы, а классы. Если точнее, классы коллекций, которые отслеживают свое состояние и при изменении генерируют событие.
0
912 / 672 / 134
Регистрация: 01.03.2010
Сообщений: 1,273
09.02.2015, 16:42 23
Цитата Сообщение от x5reunion Посмотреть сообщение
Всех благодарю за ответы буду дальше разбираться, я понял что задача не решается простым способом.
Указанный мной метод соответствует вашим критериям. Или еще какие условия есть?
0
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
09.02.2015, 18:14 24
Во! на sqlite
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
using System;
using System.Data.SQLite;
 
 
namespace SQLITE {
    class Program {
        static void Main() {
            SQLiteConnection cn = new SQLiteConnection("Data Source=db_sqlite.db; Version=3;");
            try {
                cn.Open();
                if (cn.State == System.Data.ConnectionState.Open) {
                    SQLiteCommand cmd = cn.CreateCommand();
                    string strCmd = @"
                    --чтоб внешние ключи работали
                    PRAGMA FOREIGN_KEYS=ON;
 
                    --таблица возможных планет
                    DROP TABLE IF EXISTS Планеты;
                    CREATE TABLE Планеты(
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        Имя TEXT,
                        Радиус INTEGER, 
                        ДатаОткрытия INTEGER);
 
                    INSERT INTO Планеты(Имя, Радиус, ДатаОткрытия) 
                    VALUES ('Марс', 3397, strftime('%s', '2015-01-01'));
 
                    INSERT INTO Планеты(Имя, Радиус, ДатаОткрытия) 
                    VALUES ('Венера', 6051, strftime('%s', '2015-01-02'));
 
                    INSERT INTO Планеты(Имя, Радиус, ДатаОткрытия) 
                    VALUES ('Земля', 6371, strftime('%s', '2015-01-03'));
 
                    INSERT INTO Планеты(Имя, Радиус, ДатаОткрытия) 
                    VALUES ('Юпитер', 69911, strftime('%s', '2015-01-04'));
 
                    INSERT INTO Планеты(Имя, Радиус, ДатаОткрытия) 
                    VALUES ('Сатурн', 60268, strftime('%s', '2015-01-04'));                    
                    
                    --Список планет
                    DROP TABLE IF EXISTS СписокВыбранныхПланет;
                    CREATE TABLE СписокВыбранныхПланет(
                        idd INTEGER PRIMARY KEY AUTOINCREMENT,
                        idPlanet INTEGER ,
                        FOREIGN KEY(idPlanet) REFERENCES Планеты(id) ON DELETE CASCADE);
                    
                    INSERT INTO СписокВыбранныхПланет(idPlanet) VALUES (1);
                    INSERT INTO СписокВыбранныхПланет(idPlanet) VALUES (2);
                    
                    ";
 
                    cmd.CommandText = strCmd;
                    cmd.ExecuteNonQuery();
 
                    cmd.CommandText = "SELECT count(id) FROM Планеты";
                    object amount = cmd.ExecuteScalar();
                    Console.WriteLine("Всего строк: {0}",amount.ToString());
 
                    cmd.CommandText  = "SELECT * FROM Планеты";
                    SQLiteDataReader r = cmd.ExecuteReader();
                    string strline = String.Empty;
                    while (r.Read()) {
                        strline = string.Format("id={0}, Имя={1}, Радиус={2}, Дата открытия={3}", r["id"], r["Имя"], r["Радиус"], r["ДатаОткрытия"]);
                        Console.WriteLine(strline);
                    }
                    r.Close();
 
                    cmd.CommandText  = @"SELECT * 
                                         FROM СписокВыбранныхПланет as t
                                              left join Планеты as p on(p.id=t.idPlanet)";
                    r = cmd.ExecuteReader();
                    while (r.Read()) {
                        strline = string.Format("idd={0}, id={1}, Имя={2}, Радиус={3}, Дата открытия={4}", r["idd"], r["id"], r["Имя"], r["Радиус"], r["ДатаОткрытия"]);
                        Console.WriteLine(strline);
                    }
                    r.Close();
 
                    cmd.CommandText = "delete from Планеты where id=@id";
                    cmd.Parameters.AddWithValue("@id", 1);
                    cmd.ExecuteNonQuery();
 
 
                    cmd.CommandText  = "SELECT * FROM Планеты";
                    r = cmd.ExecuteReader();
                    while (r.Read()) {
                        strline = string.Format("id={0}, Имя={1}, Радиус={2}, Дата открытия={3}", r["id"], r["Имя"], r["Радиус"], r["ДатаОткрытия"]);
                        Console.WriteLine(strline);
                    }
                    r.Close();
 
                    cmd.CommandText  = @"SELECT * 
                                         FROM СписокВыбранныхПланет as t
                                              left join Планеты as p on(p.id=t.idPlanet)";
                    r = cmd.ExecuteReader();
                    while (r.Read()) {
                        strline = string.Format("idd={0}, id={1}, Имя={2}, Радиус={3}, Дата открытия={4}", r["idd"], r["id"], r["Имя"], r["Радиус"], r["ДатаОткрытия"]);
                        Console.WriteLine(strline);
                    }
                    r.Close();
 
                    cn.Dispose();
                }
            } catch (SQLiteException ex) {
                Console.WriteLine(ex.Message);
            }
 
            Console.ReadLine();
        }
    }
}
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.02.2015, 19:42 25
x5reunion, а зачем вам вообще эти цифры 1 2 3? И являются ли они разреженными?
0
3 / 3 / 1
Регистрация: 25.03.2014
Сообщений: 45
10.02.2015, 20:00  [ТС] 26
Я пока отложил решение задачи она оказалась сложнее чем я думал, я тут посмотрел несколько примеров из темы, некоторые слишком сложны некоторые не подходят.

А по поводу ключа да без словаря никак не обойтись.
Элемент не обязательно будет находится постоянно в одном и том же списке, но должна быть возможность найти его в любой момент по ключу.
0
912 / 672 / 134
Регистрация: 01.03.2010
Сообщений: 1,273
10.02.2015, 23:35 27
Цитата Сообщение от x5reunion Посмотреть сообщение
Мне нужно иметь возможность удалить планету из Dictionary, чтобы она сразу удалилась и из List.
И иметь возможность удалить планету из List не удаляя из словаря.
И иметь возможность удалить планету из List и из Dictionary.
Оно?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
        Dictionary<int, Planet> testOne = new Dictionary<int, Planet>();
        List<Planet> testTwo = new List<Planet>();
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Planet planetOne = new Planet();
            planetOne.Name = "Vega";
 
            Planet planetTwo = new Planet();
            planetTwo.Name = "Mega";
 
            Planet planetThree = new Planet();
            planetThree.Name = "Beta";
 
 
 
            testOne.Add(0, planetOne);
            testOne.Add(1, planetTwo);
            testOne.Add(2, planetThree);
 
            testTwo.Add(testOne[0]);
            testTwo.Add(testOne[1]);
            testTwo.Add(testOne[2]);
            RemListDic(planetThree);
 
        }
 
        private void RemDicList(int index)
        {
            testTwo.Remove(testOne[index]);
            testOne.Remove(index);          
        }
 
        private void RemList(Planet planet)
        {
            testTwo.Remove(planet);
        }
 
        private void RemListDic(Planet planet)
        {
           int ****ey=-1;
 
            RemList(planet);
 
            foreach (System.Collections.Generic.KeyValuePair<int, Planet> item in testOne)
            {
                if (item.Value == planet) ****ey = item.Key;
            }
 
            if (****ey != -1) testOne.Remove(****ey);
        }
    }
 
    class Planet
    {
        public string Name { get; set; }
    }
1
3 / 3 / 1
Регистрация: 25.03.2014
Сообщений: 45
11.02.2015, 00:27  [ТС] 28
Благодарю за ответы, я просто думал в NET есть какие то спец функции, которые можно использовать и все упростить но я понял что все равно придется все свое писать. Что бы это реализовать.

Я думаю просто добавлю к классу свойство ID и буду ему присваивать ключ в словаре ну и далее там разберу или еще потом подумаю.
0
foo();
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
11.02.2015, 00:39 29
x5reunion, можно так сделать:
C#
1
Func<List<Planet>> lst = () => dict.Values.ToList();
Обращатся к Листу нужно так: lst().Count, например.
Если удалите элемент из словаря - то и в lst() его не будет

Добавлено через 33 секунды
Код писал в браузере, но, надеюсь, идея ясна
0
11.02.2015, 00:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2015, 00:39
Помогаю со студенческими работами здесь

Единые объект клиента для всех запросов в express.js
Приветствую. Интересует запись данных в handle клиента. Работая с TCP делаю так...

XmlDocument против Dictionary и List
Сразу к сути: В классе используются var dic = new Dictionary&lt;string, Dictionary&lt;string,...

Сортировка Dictionary вложенного в List
Как отсортировать по алфавиту List&lt;Dictionary&lt;string, string&gt;&gt;. Заранее спасибо

Сравнение List, Dictionary, Hashset
Здравствуйте! Подскажите, где можно узнать про колекции List, Dictionary, Hashset такие вещи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru