# 000141. Списки в c#. Запуск нескольких скритов в GTA 4

Списки в c#. Запуск нескольких скритов в GTA 4||wmysterio|wmysterio|<wmysterio@yandex.ru>|||Всем прива! Этот урок будет содержать в себе 2 темы. Одна тема общая как для программирования в c#, так и для скриптинга GTA 4 - это списки. Мы узнаем как создавать списки и рассмотрим некоторые примеры. Во второй части урока Вы узнаете как создать 2 скрипта для GTA 4 в одном файле.\
\
Списки очень похожи на массивы. Они могут содержать данные только одного типа данных, могут обращаться к элементам по индексу, но главное их отличие - динамическое изменение. если массивы имеют фиксированную длину, то списки более универсальны - длина может быть любой. Как уже было сказано, списки могут обращаться к данным по индексу: записывать и читать, но это возможно только в том случаи, если элемент был записан ранее. Шаблоном для объявления списка можно считать этот вариант:

| <p>List\<int> MyList = new List\<int>();<br></p> |
| ------------------------------------------------ |

Мы указываем класс List, который будет содержать значения типа int, указанных в треугольных скобках. Имя списка пусть будет MyList. Далее мы пользуемся конструктором, чтобы создать объект класса.\
\
Так как списки динамичны, то и добавлять/удалять элементы можно также динамически. Чтобы добавить элемент нужно воспользоваться командой:

| <p>MyList.Add( 5 );<br></p> |
| --------------------------- |

Внутри скобок мы указываем сущность, что будет добавлена в список. Тип этой сущности должен соответствовать типу самого списка. В данном случаи было добавлено число типа int.\
\
Чтобы удалить из списка элемент, нужно воспользоваться командой:

| <p>MyList.Remove( 5 );<br></p> |
| ------------------------------ |

Важно! Нужно указывать элемент, а не индекс! Чтобы удалить элемент по-индексу, нужно воспользоваться командой:

| <p>MyList.RemoveAt( 0 );<br></p> |
| -------------------------------- |

0 - это индекс существующего элемента. Таким образом из списка будет удалена пятёрка. Удалять также можно по диапазону. Для этого воспользуемся командой:

| <p>MyList.RemoveRange( 0, 1 );<br></p> |
| -------------------------------------- |

Здесь:\
0 - указываем начальную позицию(индекс);\
1 - количество элементов от индекса, которых нужно удалить из списка.\
\
Чтобы удалить все элементы списка, достаточно выполнить процедуру очистки:

| <p>MyList.Clear();<br></p> |
| -------------------------- |

Чтобы проверить количество всех элементов достаточно воспользоваться командой:

| <p>int a = MyList.Count;<br></p> |
| -------------------------------- |

В переменную а будет записано количество элементов в списке\
\
Вставлять элементы можно также в указанную позицию:

| <p>MyList.Insert( 6, 15 );<br></p> |
| ---------------------------------- |

Здесь:\
6 - индекс в списке, куда нужно вставить элемент;\
15 - сам элемент.\
\
Важно! Индекс всегда обязательно должен существовать. Иными словами на 6 позиции в списке уже должен существовать элемент. Исключением является индекс 0 - элементы будут помещаться в начало списка.\
\
Также есть возможность конвертировать список в массив. Для этого можно воспользоваться процедурой:

| <p>int\[] IntList = MyList.ToArray();<br></p> |
| --------------------------------------------- |

Тип массива и тип списка должны совпадать. дальше с массивом можно делать всё что угодно.\
\
Хотел бы рассказать об одной полезной возможности, которая есть во многих стандартный классах коллекций: поиск элемента в коллекции. Чтобы найти первый элемент вхождения нужно применить команду:

| <p>int q = MyList.IndexOf( 30 );<br></p> |
| ---------------------------------------- |

Здесь:\
30 - это элемент, который нужно найти в списке.\
q - в эту переменную будет возвращён ИНДЕКС первого вхождения. Если элемент не был найден, то в переменную будет возвращено число -1.\
\
Для поиска последнего вхождения элемента в список(последний индекс) нужно пользоваться:

| <p>int q = MyList.LastIndexOf( 30 );<br></p> |
| -------------------------------------------- |

Для примера давайте создадим класс Car, который будет содержать одно свойство - скорость, пользователь будет вводить скорость для нового Car, которые будут помещены с список. После выполнения этих действий пользователю предложат найти Car, у которых будет скорость, введенная пользователем а также их количество:Кодusing System;\
using System.Collections.Generic;\
\
namespace Consol {\
&#x20;   class Program {\
&#x20;       static void Main() {\
&#x20;           List\<Car> CarList = new List\<Car>();\
\
&#x20;           Console.WriteLine( "Привет, введите скорость для 10 автомобилей\n");\
&#x20;           for(int i = 0; i < 10; i++) {\
&#x20;               Console.Write("Введите скорость для автомобиля {0}: ", i);\
&#x20;               CarList.Add( new Car( int.Parse( Console.ReadLine() ) ) );\
&#x20;           }\
\
&#x20;           Console.Write( "\nКакую скорость нужно искать? ");\
&#x20;           int UserSpeed = int.Parse( Console.ReadLine() );\
\
&#x20;           int CountAuto = 0, tempIndex;\
\
&#x20;           Console.Write( "\nНомера транспорта с указанной скоростью:" );\
&#x20;           foreach ( Car temp in CarList ) {\
&#x20;               if ( temp.Speed == UserSpeed ) {\
&#x20;                   tempIndex = CarList.IndexOf( temp );\
&#x20;                   Console.Write( " {0}", ( tempIndex > -1 ) ? tempIndex.ToString() : "" );\
&#x20;                   CountAuto++;\
&#x20;               }\
&#x20;           }\
\
&#x20;           Console.WriteLine(";\n\nКоличество транспорта с указанной скоростью: {0}", CountAuto);\
&#x20;           Console.ReadKey();\
&#x20;       }\
&#x20;   }\
\
&#x20;   public class Car {\
&#x20;       public int Speed { get; set; }\
\
&#x20;       public Car( int Speed ) {\
&#x20;           this.Speed = Speed;\
&#x20;       }\
&#x20;   }\
}Тест программы:\
![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/2/85711019.png)\
Я специально взял список объектов класса, чтобы Вам было легче понять саму работу программы, потому что если взять объекты типа int, то возникнет сплошная путаница, как было со мной при изучении списков. Надеюсь вы сможете понять этот пример, так как списки встречаются и в скриптинге GTA 4.\
\
Важно! Для работами со списками(коллекциями) необходимо подключить библиотеку:

\
Вторая часть урока будет ближе к СкриптХуку и здесь я объясню как сделать два скрипта в одном файле. Как известно скрипт будет считаться скриптом только в том случаи, если класс наследуется от Script. Из этого можно сделать вывод, что следующий код будет запускать сразу 2 скрипта:

| <p>namespace TestScript {<br>    public class Demo1 : Script {<br>        public Demo1() {<br>        }   <br>    }<br><br>    public class Demo2 : Script {<br>        public Demo2() {<br>        }<br>    }<br>}<br></p> |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

Из этого можно провести аналогию, что namespace - это главный поток **:MAIN** из Sanny Builder, а Demo1 и Demo2 - созданные им потоки. Следовательно код выше можно сравнить с этим:

| <p>:MAIN<br>thread 'MAIN'<br>wait 0<br>// ...<br>// ...<br>// ...<br>create\_thread @Demo1<br>create\_thread @Demo2<br>end\_thread<br><br>:Demo1<br>thread 'Demo1'<br>wait 0<br>end\_thread<br><br>:Demo2<br>thread 'Demo2'<br>wait 0<br>end\_thread<br></p> |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

Для полного сравнения напишем код для c# и Sanny Builder:

|                                                                                                                                                                                         **c#**                                                                                                                                                                                         |                                                                                                                                                                                                        \*\* Sanny Builder\*\*                                                                                                                                                                                                        |
| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| <p>namespace TestScript {<br><br>public class Demo1 : Script {<br><br>public Demo1() {<br>Wait( 2000 );<br>Player.Character.Money += 10000;<br>Game.DisplayText("Money gived");<br>}   <br>}<br><br>public class Demo2 : Script {<br><br>public Demo2() {<br>Wait( 5000 );<br>Player.Character.Weapons.Uzi.Ammo = 500;<br>Game.DisplayText( "Ammo gived" );<br>}<br>}<br><br>}<br></p> | <p>:MAIN<br>thread 'MAIN'<br>wait 0<br>// ...<br>create\_thread @Demo1<br>create\_thread @Demo2<br>end\_thread<br><br>:Demo1<br>thread 'Demo1'<br>wait 2000<br>Player.Money(0) += 10000<br>0ACE: show\_formatted\_text\_box "Money gived"<br>end\_thread<br><br>:Demo2<br>thread 'Demo2'<br>wait 5000<br>01B2: give\_actor $PLAYER\_ACTOR weapon 28 ammo 500<br>0ACE: show\_formatted\_text\_box "Ammo gived"<br>end\_thread<br></p> |

\
Внимание! С этого момента уроки по c# разбиваются на 2 русла. Первой будет идти непосредственно по СкриптХуку, второе - по программировании в c#, которое я буду вести параллельно с остальными.\
\
С Вами был wmysterio, пока!|1564|1|0|85711019`png`385\`271||spiski\_v\_c\_zapusk\_neskolkikh\_skritov\_v\_gta\_4|1392798730


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00200/00100/000141.-spiski-v-c-.-zapusk-neskolkikh-skritov-v-gta-4.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
