Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
8 / 7 / 2
Регистрация: 08.12.2020
Сообщений: 118

Как достать объект из двумерного List?

17.11.2021, 18:09. Показов 1618. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, подскажите, как достать для сравнения объект из двумерного List

C#
1
2
3
4
5
6
for (int i = 0; i < N; i++)
{
    for (int j = 0; j < N; j++)
    if (Game.num[i][j] == num && Game.value[i][j] == true)
    { k += 1; }
}
При таком написании выскакивает ошибка

Вот, как объявлял этот list (он заполняется рандомными числами в конструкторе класса)
C#
1
2
3
4
5
6
7
8
9
10
List<List<int>> num_c = new List<List<int>>();
Random rnd = new Random();
for (int i = 0; i < N; i++)
{
    num_c.Add(new List<int>());
    for (int j = 0; j < N; j++)
    {
        num_c[i].Add(rnd.Next(0, 21));
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.11.2021, 18:09
Ответы с готовыми решениями:

Как достать значение из List<List<string>>
Есть JSON в котором лист в листе using System; using Newtonsoft.Json; using System.Collections.Generic; //using...

Как из List<string> достать нужное слово
Здравствуйте, есть задачка! Во всех вопросительных предложениях текста найти и напечатать без повторений слова заданной длины. Проблема...

Как достать объект из пула?
Добрый день. Идея следующая. Есть объект спаунер-родитель. под ним появляются враги. Тоесть код с пулом уже работает все создается. ...

13
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
17.11.2021, 20:56
Цитата Сообщение от colomb Посмотреть сообщение
При таком написании выскакивает ошибка
Какая именно ошибка?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
17.11.2021, 21:15
Цитата Сообщение от colomb Посмотреть сообщение
Как достать объект из двумерного List?
В этом отношении, вроде, всё Ок.
Покажите полный текст ошибки и скрин с ней.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3415 / 2736 / 575
Регистрация: 04.09.2018
Сообщений: 8,588
Записей в блоге: 3
17.11.2021, 21:21
Да как обычно, начинающие Unity-писатели путают имена своих созданных объектов.
Лист он создает с именем num_c, а в цикле обращается к num.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
17.11.2021, 21:35
Цитата Сообщение от wizard41 Посмотреть сообщение
а в цикле обращается к num
Не только.
Обращается ещё и к Value.
Думаю, ТС дал просто пример заполнения.
Для конкретики нужен полный текст ошибки.
Может нулевой массив, выход за границы или неверное приведение типов?
Может быть что угодно.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3415 / 2736 / 575
Регистрация: 04.09.2018
Сообщений: 8,588
Записей в блоге: 3
17.11.2021, 21:40
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Может быть что угодно.
Да, конечно. Я просто предположил, на основании последних двух-трех обращений таких писак: там тупо были спутаны имена или не подключены нужные пространства.
Они же толком не изучая основ лезут в игры...
1
8 / 7 / 2
Регистрация: 08.12.2020
Сообщений: 118
19.11.2021, 12:28  [ТС]
wizard41, Элд Хасп, никакого отношения к unity и играм я увы не имею.
У меня было конкретное задание - я его реализовал на плюсах, теперь то же самое делаю на шарпе, но так как я далеко не опытный пользователь этого языка могу допускать ошибки.
Название листов разное, потому что его заполнение идет в конструкторе, после чего происходит присвоение листа num_c листу num (уже как public переменной List) (сделал я так, потому что такое задание, но то, что не полностью показал код вам - моя ошибка.)

Ошибка следующая:
Кликните здесь для просмотра всего текста

System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
в System.ThrowHelper.ThrowArgumentOutOfRan geException(ExceptionArgument argument, ExceptionResource resource)
в System.Collections.Generic.List`1.get_It em(Int32 index)
в task.Program.Game1() в C:\Users\ASUS\Desktop\task\task\Program. cs:строка 109


Вот полностью код:
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace laba_4_c_sharp
{
    class FunnyGame
    {
        public FunnyGame(int N)
        {
            List<List<bool>> value_c = new List<List<bool>>();
            List<List<int>> num_c = new List<List<int>>();
            Random rnd = new Random();
            for (int i = 0; i < N; i++)
            {
                num_c.Add(new List<int>());
                for (int j = 0; j < N; j++)
                {
                    num_c[i].Add(rnd.Next(0, 21));
                }
            }
            int check = 0;
            while (true)
            {
                //Random rnd = new Random();
                for (int i = 0; i < N; i++)
                {
                    value_c.Add(new List<bool>());
                    for (int j = 0; j < N; j++)
                    {
                        int temp = rnd.Next(0, 2);
                        if (temp == 1 && check < N * N / 2) { value_c[i].Add(true); check += 1; }
                        else value_c[i].Add(false);
                    }
                }
                if (check == N * N / 2) { break; }
                else check = 0;
                values = value_c;
                num = num_c;
            }
 
        }
 
        public bool isWin(bool k)
        {
            if (k == true) { Console.WriteLine("Поздравляю! Вы набрали нужное количество очков и победили!"); }
            else { Console.WriteLine("К сожалению, вы проиграли."); }
            return true;
        }
 
 
        public List<List<bool>> values = new List<List<bool>>();
        public List<List<int>> num = new List<List<int>>();
    }
    class Program
    {
        static void Greetings()
        {
            Console.WriteLine("Добро пожаловать в Funny Game!"); Console.WriteLine("Правила игры: вы вводите некоторое число N (N >=2), которое определяет размерность матрицы (N*N)");
            Console.WriteLine("Генерируется матрица случайнх чисел от 0 до 20 включительно, также случайно генерируется матрица со значениями true и false");
            Console.WriteLine("Каждому числу соответсвтует значение true или false. После этого вы вводите N чисел, и если числа совпадают со значением в первой таблице...");
            Console.WriteLine("... и при этом числу соотвествует значение true, то вы получаете 1 балл! Если вы сможете получить N/3 баллов, то вы выиграли. Удачи!"); Console.WriteLine("");
        }
 
        static void Restart_Game()
        {
            int num;
            try
            {
                Console.Write("Если хотите повторить игру, введите 1; если хотите выйти из игры, введите 0: "); num = int.Parse(Console.ReadLine()); Console.WriteLine("");
                if (num != 1 && num != 0) { throw new Exception("[ERROR | №2] Неверный диапазон значения. Введите 1 или 0."); } Console.WriteLine("");
                if (num == 1) { Game1(); }
                else { IError.print_error_list(); Environment.Exit(0); }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                IError.errors.Add(e.ToString());
                Restart_Game();
            }
        }
 
        static void Game1()
        {
            int N;
            int num = 0;
            int k = 0;
            bool win = false;
            try
            {
                Console.Write("Введите N: "); N = int.Parse(Console.ReadLine()); Console.WriteLine("");
                if (N < 2) { throw new Exception("[ERROR | №1] Введенное N < 2."); } 
                FunnyGame Game = new FunnyGame(N);
                Console.Write("Введите N чисел от 0 до 20: "); Console.WriteLine("");
                for (int p = 1; p < N+1; p++)
                {
                    Console.Write($"Введите: {p} число: ");
                    num = int.Parse(Console.ReadLine()); Console.WriteLine("");
                    if (num < 0 || num > 20)
                    {
                        Console.Clear();
                        throw new Exception("[ERROR | №2] Одно из введенных чисел не лежит в нужном диапазоне.");
                    }
                    for (int i = 0; i < N; i++)
                    {
                        for (int j = 0; j < N; j++)
                            if (Game.num[i][j] == num && Game.values[i][j] == true) { k += 1; if (k == N / 3) { win = true; } }
                    }
                }
                Game.isWin(win);
                Restart_Game();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                IError.errors.Add(e.ToString());
                Game1();
            }
        }
 
        static void Main(string[] args)
        {
            Greetings();
            Game1();
            Console.ReadKey();
        }
    }
}


Если я что-то сделал не так, то, пожалуйста, подскажите
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3415 / 2736 / 575
Регистрация: 04.09.2018
Сообщений: 8,588
Записей в блоге: 3
19.11.2021, 13:14
Лучший ответ Сообщение было отмечено colomb как решение

Решение

colomb, ошибка вам как бы намекает, что вы вылезли за пределы листа. Т.е. N оказался больше размерности массива. Проверяйте N выше по коду, где и какое ему присвается значение.

Добавлено через 34 минуты
Кликните здесь для просмотра всего текста
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
        static void Main()
        {
            List<List<bool>> value_c = new List<List<bool>>();
            List<List<int>> num_c = new List<List<int>>();
 
            Console.Write( "N: " );
            int N = int.Parse( Console.ReadLine() );
            Random rnd = new Random();
 
            for ( int i = 0; i < N; i++ )
            {
                num_c.Add( new List<int>() );
                for ( int j = 0; j < N; j++ )
                    num_c[ i ].Add( rnd.Next( 0, 21 ) );
            }
 
            int check = 0;
            for ( int i = 0; i < N; i++ )
            {
                value_c.Add( new List<bool>() );
                for ( int j = 0; j < N; j++ )
                {
                    int temp = rnd.Next( 0, 2 );
                    if ( temp == 1 && check < N * N / 2 )
                    { 
                        value_c[ i ].Add( true ); 
                        check += 1; 
                    }
                    else value_c[ i ].Add( false );
                }
            }
 
            foreach ( List<int> li in num_c )
            {
                foreach ( int n in li )
                    Console.Write( n + "\t" );
                Console.WriteLine();
            }
            Console.WriteLine();
 
            foreach ( List<bool> lb in value_c )
            {
                foreach ( bool b in lb )
                    Console.Write( b + "\t" );
                Console.WriteLine();
            }
 
            bool win = false;
            Console.WriteLine( "Введите N чисел от 0 до 20: " );
            for ( int p = 1; p < N + 1; p++ )
            {
                Console.Write( $"Введите: {p} число: " );
                int num = int.Parse( Console.ReadLine() ); Console.WriteLine( "" );
                if ( num < 0 || num > 20 )
                {
                    Console.WriteLine( "[ERROR | №2] Одно из введенных чисел не лежит в нужном диапазоне." );
                    p--;
                    continue;
                }
 
                int k = 0;
                for ( int i = 0; i < N; i++ )
                    for ( int j = 0; j < N; j++ )
                        if ( num_c[ i ][ j ] == num && value_c[ i ][ j ] == true )
                        {
                            k += 1;
                            if ( k == N / 3 )
                                win = true;
                        }
            }
 
            IsWin( win );
 
            Console.ReadKey();
        }
 
        public static void IsWin( bool k )
        {
            Console.WriteLine( k == true ? "Поздравляю! Вы набрали нужное количество очков и победили!" :
                "К сожалению, вы проиграли." );
        }

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
N: 4
18      3       14      16
6       15      15      6
15      11      3       0
17      4       4       1
 
False   True    True    True
True    False   True    True
True    False   True    False
False   False   False   False
Введите N чисел от 0 до 20:
Введите: 1 число: 1
 
Введите: 2 число: 2
 
Введите: 3 число: 3
 
Введите: 4 число: 5
 
Поздравляю! Вы набрали нужное количество очков и победили!
Добавлено через 1 минуту
if ( k == N / 3 ) не очень понял это условие победы..
2
8 / 7 / 2
Регистрация: 08.12.2020
Сообщений: 118
19.11.2021, 13:55  [ТС]
wizard41, должно быть if ( k == N*N / 3 )
Спасибо большое за помощь
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3415 / 2736 / 575
Регистрация: 04.09.2018
Сообщений: 8,588
Записей в блоге: 3
19.11.2021, 14:24
Цитата Сообщение от colomb Посмотреть сообщение
должно быть if ( k == N*N / 3 )
Ну с вашего кода копировал )
try/catch обычно используют там, где заранее нельзя на что-то повлиять, например при открытии файла, которого может не оказаться...
Здесь же вы полностью контролируете ситуацию, и в случае если пользователь ввел некорректное значение, то лучше отправить его на второй круг и пусть вводит снова, а не выбрасывать исключение.
1
8 / 7 / 2
Регистрация: 08.12.2020
Сообщений: 118
20.11.2021, 13:43  [ТС]
wizard41, не спорю, я так и делал предыдущие программы, но сейчас мы изучаем исключения, поэтому нужно было их сюда вставить. У меня для них даже отдельный класс написан)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
20.11.2021, 15:51
Цитата Сообщение от colomb Посмотреть сообщение
сейчас мы изучаем исключения, поэтому нужно было их сюда вставить
Оно как-то очень криво у вас вставлено.

В чём смысл исключения?
Сообщить о том, что что произошла какая-то ситуация не позволяющая продолжить выполнение кода.
И вот теперь такой момент: кто и кому сообщает?
У вас отправитель и получатель исключения реализованы одновременно в одном и том же коде.
В такой реализации - это полная беcсмыслица.
Фактически, вы просто, использую исключения, эмулируете обычный if-else.

Так же ОЧЕНЬ плохая практика это Environment.Exit(0);.
Это следует использовать ТОЛЬКО для аварийного выхода из приложения, когда дальнейшее выполнение приложения в принципе невозможно.
Для нормального завершения приложения, или для аварийного, но когда можно продолжить выполнение кода, надо "подыматься" по методам вверх и выходить там же где была и точка входа - в данном случае это метод Main.

Что бы это имело хоть какой-то смысл нужно делать примерно такую реализацию:

C#
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
        /// <summary>Запрос перезапуска игры.</summary>
        /// <returns><see langword="true"/> - игру надо перезаупустить.<br/>
        /// <see langword="false"/> - выход из приложения.</returns>
        /// <exception cref="ArgumentOutOfRangeException">Пользователь ввёл недопустимое целое значение.</exception>
        static bool Restart_Game()
        {
            Console.Write("Если хотите повторить игру, введите 1; если хотите выйти из игры, введите 0: ");
            string num = Console.ReadLine();
            if (num != "1" && num != "0")
            {
                throw new ArgumentOutOfRangeException("[ERROR | №2] Неверный диапазон значения. Введите 1 или 0.", nameof(num));
            }
 
            return num == "1";
        }
C#
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
        static void Main(string[] args)
        {
            Greetings();
            try
            {
                do
                {
                    Game1();
                } while (Restart_Game());
 
                // Какой-то код перед выходом из игры
            }
            catch (Exception ex)
            {
                // Какой-то код на случай исключений.
            }
            Console.ReadKey();
        }
0
8 / 7 / 2
Регистрация: 08.12.2020
Сообщений: 118
20.11.2021, 17:52  [ТС]
Элд Хасп, опять же не спорю.
Задача состояла в создании собственного исключения и записи его в список ошибок, который будет выведен после завершения программы.
Использовал я Environment.Exit(0); потому что подумал, что это аналогия функции exit(0) из плюсов. Больше так не буду)

В шарпе разбираюсь очень посредственно, вот что вытекает из этого.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
20.11.2021, 18:45
Цитата Сообщение от colomb Посмотреть сообщение
Задача состояла в создании собственного исключения
Да.
Но выкидывание исключения и его отлов не должны быть сразу в одном месте кода.
Смысл исключения это его "всплытие" по стеку.
Поэтому ловить его надо в вызывающем методе, а не в том где оно выкидывается.

Вот в моём примере, в методе Main() в блоке catch (Exception ex), анализируйте исключение в переменной ex и делайте то, что вам нужно: запись в лог, экстренный выход из приложения, запрос повтора ввода и т.д.

Цитата Сообщение от colomb Посмотреть сообщение
Использовал я Environment.Exit(0); потому что подумал, что это аналогия функции exit(0) из плюсов
Да, это полная аналогия.
Но Плюсы - это не ООП.
В ООО есть определённая иерархия объектов и методов, есть сильное структурное разделение функционала между ними.
Один из принципов SOLID: Single responsibility — принцип единственной ответственности.
Какая функция (структурная) возложена на Restart_Game?
Это метод UI запрашивающий у пользователя какой-то ввод.
А какое отношение ввод пользователя имеет к выходу из приложения?
Никакого.
Решение об анализе ввода должен принимать код который вызвал метод Restart_Game.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.11.2021, 18:45
Помогаю со студенческими работами здесь

Как достать указатель на объект из контейнера set
Имеется вот такой код #include &quot;stdafx.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;set&gt; ...

Как достать объект-контейнер, а не его элемент
Добрый вечер всем. Возник вопрос. Я читал Страуструпа и на одной из его глав, есть упражнение по созданию класса-контейнера, в...

Как достать объект определенного класса через Object
Такая проблема: пишу программку с графическим интерфейсом, которая сажает дерево в &quot;саду&quot;. Проблема в том, что есть функция...

Как достать объект xml, в котором содержится ключевое слово
Дан файл xml, дано слово, нужно вывести на экран объект в котором содержится данное слово. Заранее спасибо.

Как достать(использовать) объект, который находится в объекте массива?
Как достать(использовать) объект, который находится в объекте массива? Получил массив с другого файла (модуля), надо использовать в...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru