Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 12
1

Доступ из элемента коллекции к другим элементам коллекции

29.05.2013, 01:34. Показов 2763. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите как получить данные из другого элемента коллекции?
В приведенном примере необходимо реализовать метод который бы брал значение Value из другого элемента коллекции.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ObjCollection obj = new ObjCollection();
            obj.Add(new Obj("N3", 3));
            obj.Add(new Obj("N5", 5));
 
            Console.WriteLine(obj["N5"].SumValue("N3")); // должно вывести 8
 
            Console.ReadLine();
        }
    }
    class ObjCollection
    {
        public List<Obj> objCollection;
        public Obj this[string name]
        {
            get { return objCollection.Find(a => (a.Name == name)); }
        }
        public void Add(Obj obj)
        {
            objCollection.Add(obj);
        }
    }
    class Obj
    {
        public string Name;
        int Value;
        public Obj(string name, int value)
        {
            Value = value;
        }
        public int SumValue(string name)
        {
            return Value + ObjValueByName(name);
        }
        // метод доступа к другому элементу коллекции
        // name - имя элемента коллекции
        int ObjValueByName(string name)
        {
            // как реализовать эту функцию?
            // как получить доступ к другому элементу коллекции?
            return result;
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2013, 01:34
Ответы с готовыми решениями:

Доступ к элементам коллекции внутри делегата преобразования LINQ
Есть вот такой всем знакомый случай: for (int i = 1; i &lt; fitness.Length; ++i) { ...

Удаление элемента коллекции в коллекции коллекции )
Есть коллекция (к1), в ней элементы + коллекция (к2), Так вот в к2 тоже есть элементы, и из к2 надо...

Как получить доступ к полям элемента в коллекции в цикле foreach
Есть коллекция People классов Person, в которой доступ используется с помощью ключа. Если из мейна...

Получение новой коллекции путем фильтрации элементов коллекции находящихся в другой коллекции
Всем привет, нуждаюсь в помощи знатоков) Имеется вот такая иерархия если представить в JSON: {...

4
Эксперт Python
4640 / 2056 / 363
Регистрация: 17.03.2012
Сообщений: 10,139
Записей в блоге: 6
29.05.2013, 09:13 2
Метод чего, элемента коллекции?

Так делается просто, ручками, в классе Оbj.
Лучше держать ссылку на коллекцию, чем на сам другой элемент.
Но и держать ссылку на коллекцию - плохой стиль, чревато deadlock-ом.
Лучше написать в самой коллекции процедуру, которая будет делать, что надо.
0
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 12
29.05.2013, 12:07  [ТС] 3
Попробовал ссылку на ObjCollection дать каждому элементу. Теперь работает. Спасибо за подсказку.
Лучше написать в самой коллекции процедуру, которая будет делать, что надо.
метод ObjValueByName вынес в ObjCollection
Ну и, наверное, лучше уже не сделать? (добавить еще контроль на наличие элемента в ObjValueByName)

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ObjCollection obj = new ObjCollection();
            obj.Add(new Obj("N3", 3));
            obj.Add(new Obj("N5", 5));
 
            Console.WriteLine(obj["N5"].SumValue("N3")); // должно вывести 8
 
            Console.ReadLine();
        }
    }
    class ObjCollection
    {
        public List<Obj> objCollection=new List<Obj>();
        public Obj this[string name]
        {
            get { return objCollection.Find(a => (a.Name == name)); }
        }
        public void Add(Obj obj)
        {
            objCollection.Add(obj);
            obj.pColl = this;
        }
        public int ObjValueByName(string name)
        {
            return this[name].Value;
        }
    }
    class Obj
    {
       public ObjCollection pColl;
        
        public string Name;
        public int Value;
        public Obj(string name, int value)
        {
            Value = value;
            Name = name;
        }
        public int SumValue(string name)
        {
            return Value + pColl.ObjValueByName(name);
        }
    }
}
Добавлено через 9 минут
Но и держать ссылку на коллекцию - плохой стиль, чревато deadlock-ом.
кстати, как сдесь может он вылезти?
0
Эксперт Python
4640 / 2056 / 363
Регистрация: 17.03.2012
Сообщений: 10,139
Записей в блоге: 6
29.05.2013, 12:26 4
Посмотрел код.
1. Не понимаю, зачем столько сложностей. Для ваших целей, ПММ, вполне достаточно Dictionary<string, int>.
2. Если всё-таки очень хочется написать самому.
C#
1
obj["N5"].SumValue("N3")
Почему бы не написать, чтобы вызов был таким?
C#
1
obj["N5"] + obj["N3"]
Или, если "+" планируете подменить чем-то другим
C#
1
SumValue(obj["N5"], obj["N3"])
И не надо держать ссылки никакие. По быстродействию то же самое.

Цитата Сообщение от MozgOFF215 Посмотреть сообщение
кстати, как сдесь может он вылезти?
Тут пока вряд ли. Может в будущем. Кто-то будет держать элемент, gc его не соберет, а, поскольку элемент держит коллекцию, её тоже.
0
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 12
30.05.2013, 00:38  [ТС] 5
dondublon, Конечно же, касательно этого, конкретного кода вы правы. Здесь все выглядит все странно. Но этот код - это лишь пример, может не совсем удачный. Главное, что у меня в проекте нужно было элементам списка использовать данные других элементов и похоже решение с передачей ссылки класса-родителя в каждый элемент и дальнейшей реализацией необходимых методов (желательно в родителе) является единственным способом.
0
30.05.2013, 00:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2013, 00:38
Помогаю со студенческими работами здесь

Живой поиск по элементам коллекции
Доброго времени суток, форумчане! Очень нужна помощь. Может кто сталкивался или делал или может в...

Многопоточное прохождение по элементам коллекции
Здравствуйте. Есть программа. Ей нужно дать, допустим, 100 ссылок, и указать, чтобы по каждой...

Сделать сортировку коллекции вместо создания новой коллекции с передачей IOrderedEnumerable<T>
Есть: SortableObservableCollection&lt;T&gt; using System; using System.Collections.Generic; using...

Как удалить элемент из коллекции, во время перебора этой коллекции foreach?
Прив. Смотрите что. Есть сервер, на нем 2 класса - Server &amp; ClientConnection. При подключении...

Обратиться к элементам коллекции через индекс
Есть вектор типа Student. Пытаюсь обратится к элементам каждого студента, однако по индексу...

Комбобокс и коллекции. Или коллекции комбобоксов
Ребят, изобразил пример, посмотрите пожалуйста ...там при двойном щелчке на, допустим &quot;Профессия...


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

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