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

Можно ли создать список содержащий элементы типа string?

02.12.2020, 19:13. Показов 993. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пробовал вот так, но выдает ошибку
C#
1
 public static var Statistic = new List <string> ();
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2020, 19:13
Ответы с готовыми решениями:

Создать класс вектор, содержащий элементы типа long double, размерность вектора
срочно!!!!!!!!!!! Пожалуйстаааа Задание 3. Создать класс вектор, содержащий элементы типа long...

Создать список, содержащий элементы общие для двух списков
разработать алгоритм программы решения задачи создания списка содержащего элементы общие для двух...

Посмотрите объявление вектора и попытайтесь создать динамический массив, содержащий элементы типа char
#include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; int main() { vector&lt;int&gt; DynArrNums...

создать односвязный список на Си, содержащий элементы 12, 93,301. Удалить из этого списка 93.
создать односвязный список на Си, содержащий элементы 12, 93,301. Удалить из этого списка 93

18
1 / 1 / 0
Регистрация: 09.05.2020
Сообщений: 60
02.12.2020, 19:17 2
C#
1
public static List <string> Statistic = new List <string> ();
но public static практика плохая.
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
02.12.2020, 19:22  [ТС] 3
Gagarin23, Почему плохая практика?
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
02.12.2020, 19:46  [ТС] 4
Gagarin23, Вот он что выдает на эту строку. Я так вроде пробовал
Миниатюры
Можно ли создать список содержащий элементы типа string?  
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
02.12.2020, 19:52  [ТС] 5
А всё понял в чём проблема

Добавлено через 2 минуты
Gagarin23, Просто я создаю множество экземпляров классов и помещаю их в массив. И мне нужно чтобы list не занулялся постоянно. И поэтому я не нашёл ничего умнее как просто сделать список статичным, насколько мне известно статические переменные постоянны и не зависит от экземпляров класса.
0
Модератор
Эксперт .NET
15789 / 10946 / 2843
Регистрация: 21.04.2018
Сообщений: 32,109
Записей в блоге: 2
02.12.2020, 19:58 6
Цитата Сообщение от danhiroman Посмотреть сообщение
Вот он что выдает на эту строку. Я так вроде пробовал
Не хватает юсинга.
Слева вверху возле всплывшего сообщения видите маленький квадрат с жёлтым кружком и стрелкой вниз.
Это "Быстрые решения".
Кликаете на них.
Выйдет подсказка с нужным юсингом.

Добавлено через 57 секунд
Цитата Сообщение от danhiroman Посмотреть сообщение
Просто я создаю множество экземпляров классов и помещаю их в массив. И мне нужно чтобы list не занулялся постоянно. И поэтому я не нашёл ничего умнее как просто сделать список статичным, насколько мне известно статические переменные постоянны и не зависит от экземпляров класса.
Ккая-то абра-катабра...
Совершено не понял чего вы там создаёте.
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
02.12.2020, 20:08  [ТС] 7
Элд Хасп, Да спасибо, я загуглил уже.

Добавлено через 10 минут
Элд Хасп, Такс попробую сформулировать как человек. Попробую на примере объяснить. Имеется следующий код.
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
    class Voin
    {
        public static string[] Pynkt = { "0", "0" };
 
    }
        class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Введите количество военных");
            int count = Convert.ToInt32(Console.ReadLine());
            
            Voin[] Soldiers = new Voin[count];
            for (int i=0;i<count; i++)
            {
                if (i % 7 == 0) Soldiers[i] = new Voin(importance: true);
                else Soldiers[i] = new Voin();
            }
 
                for (int i = 0; i < count; i++)
            {
                Soldiers[i].ChangePrikaz();// в этом есть та самая переменная Pynkt и она тут меняется
            }
}
}
Правильно ли я понимаю, если бы у меня переменная Pynkt не была статической, то для каждого вызванного метода ChangePrikaz, всегда бы Pynkt={"0","0"}, а поскольку она у меня статическая то она изменяется постоянно.
0
Модератор
Эксперт .NET
15789 / 10946 / 2843
Регистрация: 21.04.2018
Сообщений: 32,109
Записей в блоге: 2
02.12.2020, 20:25 8
Цитата Сообщение от danhiroman Посмотреть сообщение
Правильно ли я понимаю, если бы у меня переменная Pynkt не была статической, то для каждого вызванного метода ChangePrikaz, всегда бы Pynkt={"0","0"}, а поскольку она у меня статическая то она изменяется постоянно.
Нет, не правильно.

Есть члены экземпляра и члены объекта.
Члены объекта объявляются как статические.
Они создаются в единственном числе.
И для обращения к ним надо указать только тип в котором они объявлены.

Члены экземпляра создают отдельно для каждого экземпляра.
И для обращения к ним надо обращаться через созданный экземпляр.

В вашем коде, у типа Voin есть метод экземпляра ChangePrikaz изменяющий в статическом поле список Pynkt.
Этот список один для всего приложения.
И его может изменить любой желающий.

Поэтому все солдаты работают с одниv списком. И даже больше, все экземпляры воина тоже будут менять этот единственный список.

Если вы у поля уберёте модификатор static, то это поле станет членом экземпляра.
Оно будет создаваться для каждого экземпляра.
И каждый воин будет иметь свой независящий от других воинов список Pynkt.


Ещё пара замечаний:
- Публичные поля это атавизм ранних версий C#. В современном C# поля используются только приватные. Для публичных значений надо создавать свойства.
- Соблюдайте Правила именованияю В данном коде - имена должны быть осмысленными английскими выражениями, сочетаниями слов.
- так же полено будет прочитать Рекомендации по программированию Net
1
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
02.12.2020, 20:31  [ТС] 9
Элд Хасп, Ну я вроде это и имел ввиду всё то, что вы написали, только на своём "обезьяньем". Я и добивался такой цели, чтобы все экземпляры воина работали с одним Pynkt. И по этой же причине, я и хочу создать static список, чтобы также все экземпляры воина записывали данные только в один список.
0
Модератор
Эксперт .NET
15789 / 10946 / 2843
Регистрация: 21.04.2018
Сообщений: 32,109
Записей в блоге: 2
02.12.2020, 21:24 10
Цитата Сообщение от danhiroman Посмотреть сообщение
И по этой же причине, я и хочу создать static список, чтобы также все экземпляры воина записывали данные только в один список.
Тогда логичнее сделать метод ChangePrikaz тоже статическим.
А список сделать свойством "только для чтения".
C#
1
2
3
4
5
6
7
8
9
    class Voin
    {
        public static string[] Pynkt {get;} = { "0", "0" };
 
        public static void ChangePrikaz(Voin voin) // Если в методе нужны данные конкретного воина.
        {
             ------------
        }
    }
Так же распространённым в Net является создание специальных коллекций.
Для примера:
C#
1
2
3
4
5
6
7
8
9
public class Squad : List<Voin>
{
        public string[] Pynkt {get;} = { "0", "0" };
 
        public void ChangePrikaz(Voin voin) // Если в методе нужны данные конкретного воина.
        {
             ------------
        }
}
В результате вы получаете единицу ОТРЯД в которой все Воины работают с одним приказом.
И вы можете создать несколько отрядов у каждого из которых будет свой приказ.
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
03.12.2020, 14:08  [ТС] 11
Элд Хасп, Добрый день. А есть ли возможность передать массив объектов в статический метод? Просто не хочется постоянно писать цикл for, а то их слишком много у меня получается в main.
C#
1
2
3
4
            for (int i = 0; i < count; i++)
            {
                Soldiers[i].InfoAboutSoldier();
            }
0
Модератор
Эксперт .NET
15789 / 10946 / 2843
Регистрация: 21.04.2018
Сообщений: 32,109
Записей в блоге: 2
03.12.2020, 15:05 12
Цитата Сообщение от danhiroman Посмотреть сообщение
А есть ли возможность передать массив объектов в статический метод? Просто не хочется постоянно писать цикл for, а то их слишком много у меня получается в main.
Конечно.
Но обычно параметр метода типизируется нужным интерфейсом:
  • IList<T> - коллекция с целочисленными индексами (в том числе массивы);
  • ICollection<T> - коллекция с возможностью её изменения;
  • IEnumerable<T> - просто неизменяемая последовательность. Доступ к членам по циклу foreach.

В зависимости от логики метода задаёте разный интерфейс.

Допустим:
C#
1
2
3
4
5
6
7
8
9
10
11
    class Voin
    {
 
        public static void ChangePrikaz(IEnumerable<Voin> squad)
        {
             foreach(Voin voin in squad)
             {
                  // Здесь работаете последовательно с каждым voin
             }
        }
    }
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
03.12.2020, 16:37  [ТС] 13
Элд Хасп, Можно ли в эту тему скинуть итоговый код того, что я нарешал или нужно отдельную тему создать? И Вы дадите свою оценку по коду, совсем плохо или терпимо.
0
Модератор
Эксперт .NET
15789 / 10946 / 2843
Регистрация: 21.04.2018
Сообщений: 32,109
Записей в блоге: 2
03.12.2020, 16:40 14
Цитата Сообщение от danhiroman Посмотреть сообщение
Можно ли в эту тему скинуть итоговый код того, что я нарешал или нужно отдельную тему создать?
Скидывайте сюда.
Этот же код связан с вопросом топика.
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
03.12.2020, 16:45  [ТС] 15
Элд Хасп, Сильно не бейте ток). Я помню, что вы писали про наименование переменных, но пока не могу полностью от привычки транслита отойти. И по поводу, что поля нужно делать приватными тоже помню, но когда они приватные, я не мог ими оперировать в методе VxodVPunkt() , а как передать их не придумал.

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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
    public class Voin
    {      
        public bool importancevalue;        
        public string name;
        public string zvanie;
        public string prikaz;
        public Voin(string imena, string runk, string work, bool importance = false, string ukaz = "Идти в разведку")
        {
            if (importance == false)
            {
                importancevalue = false;
                name = imena;
                zvanie = runk;
                prikaz = work;
            }
            else
            {
                importancevalue = true;
                name = imena;
                zvanie = runk;
                prikaz = ukaz;
            }
        }
 
        public void InfoAboutSoldier()
        {           
            Console.WriteLine(name + "\t" + zvanie + "\t" + prikaz + "\t" + importancevalue);
        }         
    }
    public static class PynktSvz
    { 
        static string[] Pynkt = { "0", "0" };
        static int counterRidovoi = 0;
        static int counterEfreitor = 0;
        static int counterSergant = 0;
        static int counterCapitan = 0;
        static List<string> Statistic = new List<string>();
        static void VxodVPunkt(Voin soldier, string[] runk)
        {
            if (soldier.importancevalue == false)
            {
                if (Array.IndexOf(runk, Pynkt[0]) < Array.IndexOf(runk, soldier.zvanie) || Pynkt[0] == "0") //у военного выше или нет приказа
                {
                    Pynkt[0] = soldier.zvanie;
                    Pynkt[1] = soldier.prikaz;
                    Statistic.Add(Pynkt[1]);
                    soldier.prikaz = "Нет приказа";
                }
                else if (Array.IndexOf(runk, Pynkt[0]) > Array.IndexOf(runk, soldier.zvanie)) //в пункте звание выше
                {
                    soldier.prikaz = Pynkt[1];
                    Pynkt[0] = "0";
                    Pynkt[1] = "Нет приказа";
                    Statistic.Add(Pynkt[1]);
                }
            }
            else
            {
                Pynkt[0] = soldier.zvanie;
                Pynkt[1] = soldier.prikaz;
                Statistic.Add(Pynkt[1]);
                soldier.prikaz = "Нет приказа";
                soldier.importancevalue = false;
            }
        }
        public static void AllSoldiersCome(IEnumerable<Voin> squad, string[] runk)
        {
            foreach (Voin voin in squad)
            {
                VxodVPunkt(voin,runk);
                if (voin.zvanie == "Рядовой ") counterRidovoi++;
                else if (voin.zvanie == "Ефрейтор") counterEfreitor++;
                else if (voin.zvanie == "Сержант ") counterSergant++;
                else counterCapitan++;
            }
            Console.WriteLine("\nПорядок изменения приказов в пункте связи\n");
            ShowStatistic();
        }
        
        static void ShowStatistic()
        {   
            Statistic.Add("Количество военных посетивших пункт связи:"+ (counterRidovoi + counterEfreitor + counterSergant + counterCapitan));
            Statistic.Add("Рядовых:"+counterRidovoi);
            Statistic.Add("Ефрейторов:" + counterEfreitor);
            Statistic.Add("Сержант:" + counterSergant);
            Statistic.Add("Капитанов:" + counterCapitan);
            foreach (string i in Statistic)
            {
                Console.Write(i+"\n");
            }
        }
    }
 
 
    class Program
    {
        static void Main(string[] args)
        {
            Random rnd = new Random();
            string[] imena = { "Артём", "Андрей", "Алексей", "Илья", "Валерий", "Вова", "Денис", "Дмитрий" };
            string[] familia = { "Макшаев", "Федин", "Павлов", "Суслов", "Круглов", "Мельник", "Гараев", "Фомин" };
            string[] runk = { "Рядовой ", "Ефрейтор", "Сержант ","Капитан " };
            string[] work = { "Уборка казарм", "Готовка еды", "Чистка оружия", "Стрельбище", "Испытания" };
            Start:
            Console.WriteLine("Введите количество военных. Максимально возможное число не может превышать 30.");
            string counter = Console.ReadLine();
            uint res;
            if (uint.TryParse(counter, out res))
            {
                int count = Convert.ToInt32(counter);
                if (count <= 30)
                {
                    Voin[] Soldiers = new Voin[count];
                    for (int i = 0; i < count; i++)
                    {
                        if (i % rnd.Next(5,8) == 0)
                            Soldiers[i] = new Voin(imena[rnd.Next(0, imena.Length)] + "\t" + familia[rnd.Next(0, familia.Length)], runk[rnd.Next(0, runk.Length)], work[rnd.Next(0, work.Length)], importance: true);
                        else
                            Soldiers[i] = new Voin(imena[rnd.Next(0, imena.Length)] + "\t" + familia[rnd.Next(0, familia.Length)], runk[rnd.Next(0, runk.Length)], work[rnd.Next(0, work.Length)]);
                    }
                    Console.WriteLine("\nВоенные до посещения пункт связи");
                    for (int i = 0; i < count; i++)
                    {
                        Soldiers[i].InfoAboutSoldier();
                    }
 
                    PynktSvz.AllSoldiersCome(Soldiers, runk);
 
                    Console.WriteLine("\nВоенные после того как прошил пункт связи");
                    for (int i = 0; i < count; i++)
                    {
                        Soldiers[i].InfoAboutSoldier();
                    }
                }
                else
                {
                    Console.WriteLine("Число слишком большое. Введите пожалуйста другое.");
                    goto Start;
                }
            }
            else
            {
                Console.WriteLine("Вы ввели неверный формат числа.Повторите ввод.");
                goto Start;
            }
 
 
        }
    }
0
Модератор
Эксперт .NET
15789 / 10946 / 2843
Регистрация: 21.04.2018
Сообщений: 32,109
Записей в блоге: 2
03.12.2020, 17:24 16
Цитата Сообщение от danhiroman Посмотреть сообщение
Сильно не бейте ток).
Токо чуток...

В современном C# не используются публичные поля.
Это атавизм ранних версий.
Используйте вместо них публичные свойства.
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
03.12.2020, 17:43  [ТС] 17
Элд Хасп, Ну не считая public полей и наименований, в остальном более менее терпимо?
0
Модератор
Эксперт .NET
15789 / 10946 / 2843
Регистрация: 21.04.2018
Сообщений: 32,109
Записей в блоге: 2
03.12.2020, 17:58 18
Цитата Сообщение от danhiroman Посмотреть сообщение
Ну не считая public полей и наименований, в остальном более менее терпимо?
Я же не могу оценить логику.
Поэтому могу написать только о внешних признаках.

О static членах вам писали.
Статическими могут быть только методы.
Вместо статического класса PynktSvz вам надо создать экземпляр этого класса и работать с ним.
Но вы не захотели так делать.

Мне не нравится передача массива в метод.
Допустим, в методе VxodVPunkt(Voin soldier, string[] runk) вы только находите индекс элемента.
Для этого лучше передавать IList: VxodVPunkt(Voin soldier, IList<string> runk).
И проверять методом IndexOf().

Но в данном случае, даже сам этот массив со строками неоднозначен.
Вы там храните звания.
Звания - это постоянный список.
Для него лучше всего подойдёт перечисление.
И сравнивайте их потом по значению как целые числа.


goto - тоже вызывает большие сомнения.
Я не пишу, что его запрещено использовать, но использовать его можно только ограниченно, в действительно необходимых случаях.
И то когда метка находится в пределах 5-10 строк от оператора.
В данном же случае его использование совершено не нужно.
Здесь должен быть цикл.
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
03.12.2020, 18:05  [ТС] 19
Элд Хасп, Окей, спасибо огромное за помощь
0
03.12.2020, 18:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.12.2020, 18:05
Помогаю со студенческими работами здесь

Для данного списка L создать список L1, содержащий те же элементы, но в обратном порядке
Используйте линейный списки для хранения последовательности чисел. Описать функцию или процедуру,...

Cписок: Создать список, содержащий элементы общие для двух двунаправленных списков
Создать список содержащий элементы общие для двух двунаправленных списков Добавлено через 4 часа...

Создать список, содержащий элементы общие для двух списков, с помошью классов
разработать алгоритм программы решения задачи создания списка содержащего элементы общие для двух...

Создать двусвязный список, содержащий целые числа. Удалить все максимальные элементы
Создать двусвязный список, содержащий целые числа. Удалить все максималь* ные элементы. Например,...

Создать файл записного типа, содержащий информацию об учениках Фамилия, Имя, Отчество, Пол, Дата рождения, Курс. Распечатать список учеников, фамилии
Создать файл записного типа, содержащий информацию об учениках Фамилия, Имя, Отчество, Пол, Дата...

Создать двусвязный список целых чисел типа кольцо. Выбрать все простые числа и поместить их в односвязный список типа оч
Создать двусвязный список целых чисел типа кольцо. Выбрать все простые числа и поместить их в...


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

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