Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
1

Применять к одному, а применяется ко всему массиву

22.03.2019, 18:43. Показов 2266. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем, не знаю есть ли такое, но все же спрошу, к примеру есть класс MyClass в котором очень много полей, и если массив классов MyClass, могу ли я как-то применить что-то к одному, а что бы применилось во всем.

И нет, я могу пройтись циклом по всем элементам, но если полей много то нужно будет делать для каждого свой метод, а можно ли что бы применить к одному (либо передать параметром что нужно) и что бы изменилось.

P.S. Возможно тут поможет predicate, но я не уверен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2019, 18:43
Ответы с готовыми решениями:

Текстура применяется не ко всему кубу
есть массив вершин и индексы для отрисовки: MyVector3f vertex_buffer_data; // Position ...

Обращение ко всему массиву в классах
Всем привет. Есть класс: typedef unsigned int ui; class Location { private: ...

Присвоение значений всему массиву
Друзья, подскажите, пожалуйста. Есть в Delphi оператор или команда, с помощью которой можно...

Как реализовать замену по всему массиву?
Подскажите пожалуйста как реализовать замену по всему массиву? Дан массив, который содержит...

13
3560 / 2501 / 1174
Регистрация: 14.08.2016
Сообщений: 8,206
22.03.2019, 21:25 2
можно сделать поле статичным, тогда его изменение отразится на ВСЕХ экземплярах класса, даже если он не в массиве
ну или цикличное изменение, хоть руками, хоть LINQом
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
22.03.2019, 21:32 3
Цитата Сообщение от kitsoRik Посмотреть сообщение
И нет, я могу пройтись циклом по всем элементам
почему?
Цитата Сообщение от kitsoRik Посмотреть сообщение
но если полей много то нужно будет делать для каждого свой метод, а можно ли что бы применить к одному (либо передать параметром что нужно) и что бы изменилось.
лучше расскажите что хотите сделать, почему такие большие классы и тд. Иначе рискуем придумать плохое решение придуманной проблемы
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
22.03.2019, 21:46  [ТС] 4
КОП, в данный момент это не совсем решения, но как вариант вполне себе.

Есть библиотека, в ней класс, и мне нужно создать массив этих классов, и изменять значения у всех одновременно.

Цитата Сообщение от КОП Посмотреть сообщение
почему?
Почему циклом не могу?

Потому-что при N кол-во полей, мне нужно ровно N методов для изменения.

А при N > 10 это уже костыль.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
22.03.2019, 22:14 5
Цитата Сообщение от kitsoRik Посмотреть сообщение
Потому-что при N кол-во полей, мне нужно ровно N методов для изменения.
А при N > 10 это уже костыль.
циклу всё равно сколько полей, это разные плоскости.

А так гадальный шар предлагает три варианта:
статик поле
словарик
рефлексия
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
22.03.2019, 22:51  [ТС] 6
Цитата Сообщение от КОП Посмотреть сообщение
циклу всё равно сколько полей, это разные плоскости.
воу воу, так мне не нужно изменять прям все, иногда только первое поле, иногда второе и третье, тут уж разница будет
Цитата Сообщение от КОП Посмотреть сообщение
статик поле
словарик
рефлексия
совсем не поняли меня, мне нужно вместо:

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
class MyClass
{
    public int int1;
    public int int2;
    public int int3;
}
 
class Class2
{
    MyClass[] myClasses;
 
    public int int1
    {
        get
        {
            return myClasses[0].int1;
        }
 
        set
        {
            foreach(MyClass my in myClasses)
            {
                my.int1 = value;
            }
        }
    }
 
    public int int2
    {
        get
        {
            return myClasses[0].int2;
        }
 
        set
        {
            foreach (MyClass my in myClasses)
            {
                my.int2 = value;
            }
        }
    }
 
    public int int3
    {
        get
        {
            return myClasses[0].int3;
        }
 
        set
        {
            foreach (MyClass my in myClasses)
            {
                my.int3 = value;
            }
        }
    }
}
какой нить:
C#
1
2
3
4
5
6
7
8
9
public T Get<>(...)
{
return myClasses...
}
 
public void Set(...)
{
myClasses.... = ...
}
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
22.03.2019, 23:13 7
Лучший ответ Сообщение было отмечено kitsoRik как решение

Решение

Цитата Сообщение от kitsoRik Посмотреть сообщение
воу воу, так мне не нужно изменять прям все, иногда только первое поле, иногда второе и третье, тут уж разница будет
я всё еще не понял о чем вы, сколько полей попросите изменить, столько и изменится. цикл лишь для прохода по всем экземплярам.
Цитата Сообщение от kitsoRik Посмотреть сообщение
совсем не поняли меня
вот с примером куда понятнее. вот эта фраза воодила в заблуждение:
Цитата Сообщение от kitsoRik Посмотреть сообщение
могу ли я как-то применить что-то к одному, а что бы применилось во всем.
Цитата Сообщение от kitsoRik Посмотреть сообщение
какой нить:
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
        class MyClass
        {
            public int int1;
            public int int2;
            public int int3;
        }
 
        class Class2
        {
            public MyClass[] myClasses = new []{new MyClass(), new MyClass(), };
 
            public T Get<T>(string prop)
            {
                var p = typeof(MyClass).GetField(prop);
                return (T)p.GetValue(myClasses[0]);
            }
 
            public void Set(string prop, object value)
            {
                var p = typeof(MyClass).GetField(prop);
                foreach (var myClass in myClasses)
                {
                    p.SetValue(myClass, value);
                }
            }
        }
 
 
        public static unsafe void Main(string[] args)
        {
            var c = new Class2();
            c.Set("int1", 5);
            int i = c.Get<int>("int1");
            Console.ReadKey();
        }
и всё равно необходимость неординарная. не зная задачи не скажу точно, но выглядит как костыль, и пахнет как костыль, и крякает как костыль
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
23.03.2019, 12:58  [ТС] 8
Цитата Сообщение от КОП Посмотреть сообщение
и всё равно необходимость неординарная. не зная задачи не скажу точно, но выглядит как костыль, и пахнет как костыль, и крякает как костыль
вообще да, костыль но иного способа нет? Что бы не писать имя поля как строку?
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.03.2019, 13:44 9
Цитата Сообщение от kitsoRik Посмотреть сообщение
вообще да, костыль но иного способа нет?
не понимая исходной задачи не могу сказать, наверняка есть.

Цитата Сообщение от kitsoRik Посмотреть сообщение
Что бы не писать имя поля как строку?
а как хотите обозначать поле? его же придется как-то выбирать. И почему это должно быть поле? у меня пока больше вопросов чем ответов
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
23.03.2019, 22:22  [ТС] 10
Цитата Сообщение от КОП Посмотреть сообщение
И почему это должно быть поле?
либо свойство, есть еще что-то?
Цитата Сообщение от КОП Посмотреть сообщение
не понимая исходной задачи не могу сказать, наверняка есть.
нужно применять сразу ко всем элементам массива, и изменять именно те поля которые нужно в коде.

Но полей может быть много.
0
544 / 352 / 119
Регистрация: 17.08.2014
Сообщений: 1,335
23.03.2019, 22:45 11
Лучший ответ Сообщение было отмечено kitsoRik как решение

Решение

kitsoRik, вы городите какую то ересь.
самое простое для экземпляров класса это форич по коллекции по другому изменить можно только как вам уже сказали статическое свойство.
Тестируйте

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
    public class MyClass
        {
            public int int1;
            public int int2;
            public int int3;
            public static int int01;
            public int Get01
            {
                get { return int01; }
            }
 
        }
 
        public class MyClass2 : List<MyClass>
        {
 
 
 
 
 
        }
 
        public void main()
        {
            MyClass2 m = new MyClass2() { new MyClass(), new MyClass(), new MyClass() };
            m.ForEach(_ => _.int1 = 20);// изменяем у всех.
            MyClass.int01 = 15;// так же изменяем у всех;
 
            m.ForEach(_ => Console.WriteLine(" значение int1: " + _.int1 + " значение int01: " + _.Get01));
 
        }
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.03.2019, 22:50 12
Цитата Сообщение от kitsoRik Посмотреть сообщение
либо свойство, есть еще что-то?
словарь, json и т.д.
Цитата Сообщение от kitsoRik Посмотреть сообщение
нужно применять сразу ко всем элементам массива, и изменять именно те поля которые нужно в коде.
Но полей может быть много.
вы не ответили на самое важное
Цитата Сообщение от КОП Посмотреть сообщение
а как хотите обозначать поле? его же придется как-то выбирать. И почему это должно быть поле?
0
544 / 352 / 119
Регистрация: 17.08.2014
Сообщений: 1,335
23.03.2019, 23:02 13
КОП, да в любом случае если это экземпляры классов то нужно проходить коллекцию. Писать свои предикаты для своей же коллекции можно сказать бессмысленно. Все давно уже сделано на основе стандартного Ilist. Многие по незнанию начинают закатывать солнце руками.
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
23.03.2019, 23:12  [ТС] 14
Цитата Сообщение от КОП Посмотреть сообщение
вы не ответили на самое важное
поле же будет обозначено как всегда, это не временный код, я хотел его использовать в будущем
0
23.03.2019, 23:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2019, 23:12
Помогаю со студенческими работами здесь

Switch Case производит итерацию по всему массиву
Всем здравствуйте! Столкнулся с очень странной проблемой: есть матрица 10 строк, 3 столбца....

Не применять стилизацию к одному элементу
Добрый день, на сайте ко всем картинкам применен стиль растягивать по ширине, но есть картинки...

Введенный с клавиатуры массив отсортировать в алфавитном порядке по всему массиву
Введенный с клавиатуры массив,произвольного размера состоящий из латинских букв отсортировать: а)в...

Задаю стиль одному table, но он применяется и к другому
Задаю стиль одному table, но он частично применяется и к другому. Не пойму в чём дело. Я ведь и...

Если применять эту функцию к массиву, то он будет удаляться без всяких утечек памяти и т.п.?
//Функция удаления двумерного массива void delete_array(int** arr, int row) { for (int i = 0; i...

Обнулить строки матрицы, среднее арифметическое которых меньше среднего арифметического по всему массиву
В двумерном целочисленном массиве размера N на K обнулить строки, среднее арифметическое которых...


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

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