Коллекции C#
Библиотека базовых классов .NET содержит несколько типов коллекций, которые можно использовать для хранения и обработки данных. Godot также предоставляет несколько типов коллекций, тесно интегрированных с остальной частью движка.
Выберите коллекцию
Главное различие между коллекциями .NET и коллекциями Godot заключается в том, что коллекции .NET реализованы на языке C#, тогда как коллекции Godot реализованы на языке C++, а API Godot C# является оболочкой над ними. Это важное различие, поскольку оно означает, что каждая операция над коллекцией Godot требует маршалинга, который может быть затратным, особенно внутри цикла.
Из-за влияния на производительность использование коллекций Godot рекомендуется только в случае крайней необходимости (например, для взаимодействия с API Godot). Godot распознаёт только собственные типы коллекций, поэтому при взаимодействии с движком необходимо использовать именно их.
Если у вас есть коллекция элементов, которые не нужно передавать в API Godot, использование коллекции .NET будет более производительным.
Совет
Также возможно преобразование между коллекциями .NET и коллекциями Godot. Коллекции Godot содержат конструкторы из универсальных интерфейсов коллекций .NET, которые копируют их элементы, а коллекции Godot можно использовать с методами LINQ ToList, ToArray и ToDictionary. Но имейте в виду, что это преобразование требует маршалинга (marshaling) каждого элемента коллекции и копирования его в новую коллекцию, поэтому может быть затратным.
Несмотря на это, коллекции Godot оптимизированы для избежания ненужного маршалинга, поэтому такие методы, как Sort или Reverse, реализуются одним вызовом взаимодействия и не требуют маршалинга каждого элемента. Обратите внимание на универсальные API, принимающие интерфейсы коллекций, такие как LINQ, поскольку каждый метод требует итерации коллекции и, следовательно, маршалинга каждого элемента. По возможности предпочитайте использовать методы экземпляра коллекций Godot.
Чтобы выбрать, какой тип сбора использовать в каждой ситуации, рассмотрите следующие вопросы:
Должна ли ваша коллекция взаимодействовать с Godot engine? (например: тип экспортируемого свойства, вызов метода Godot).
Если да, то, поскольку Godot поддерживает только Variant-compatible типы, используйте коллекцию Godot.
Если нет, рассмотрите возможность выбора подходящей коллекции .NET.
Вам нужна коллекция Godot, представляющая собой список или последовательный набор данных?
Godot arrays похожи на коллекцию C#
List<T>.Godot packed arrays являются более эффективными по памяти массивами, в C# используйте один из поддерживаемых типов
System.Array.
Вам нужна коллекция Godot, которая сопоставляет набор ключей с набором значений?
Godot dictionaries хранят пары ключей и значений и обеспечивают легкий доступ к значениям по связанному с ними ключу.
Коллекции Godot
PackedArray
Упакованные массивы Godot реализованы как массив определенного типа, что позволяет упаковывать их более плотно, поскольку каждый элемент имеет размер определенного типа, а не Variant.
В C# упакованные массивы заменяются на System.Array:
GDScript |
C# |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Другие массивы C# не поддерживаются API Godot C#, поскольку для них не существует эквивалента упакованного массива. См. список Variant-compatible типы.
Массив
Массивы Godot реализованы как массив Variant и могут содержать несколько элементов любого типа. В C# эквивалентный тип — Godot.Collections.Array.
Универсальный тип Godot.Collections.Array<T> позволяет ограничить тип элемента до Variant-compatible type.
Нетипизированный Godot.Collections.Array можно преобразовать в типизированный массив с помощью конструктора Godot.Collections.Array<T>(Godot.Collections.Array).
Примечание
Несмотря на название, массивы Godot больше похожи на коллекцию List<T> в C#, чем на System.Array. Их размер не фиксирован и может увеличиваться или уменьшаться по мере добавления/удаления элементов в коллекцию.
Список методов массива Godot и их эквиваленты в C#:
GDScript |
C# |
|---|---|
all )все( |
|
any (любой) |
|
append |
Add |
append_array |
AddRange |
assign |
Очистить и AddRange (добавить диапазон) |
back |
|
bsearch |
BinarySearch |
bsearch_custom |
N/A |
чисто |
Clear |
count |
|
duplicate |
Дублировать |
erase |
Удалить |
fill (заполнять) |
Fill |
filter |
Используйте System.Linq.Enumerable.Where |
find |
IndexOf |
front |
|
get_typed_builtin |
N/A |
get_typed_class_name |
N/A |
get_typed_script |
N/A |
has (имеет) |
Contains (Содержит) |
hash |
GD.Hash |
insert |
Insert |
is_empty |
Использовать |
is_read_only |
IsReadOnly |
is_same_typed |
N/A |
is_typed |
N/A |
make_read_only |
MakeReadOnly |
map (карта) |
|
max |
Max |
min |
Min |
pick_random |
PickRandom (Рассмотрите возможность использования System.Random) |
pop_at |
|
pop_back |
|
pop_front |
|
push_back |
|
push_front |
|
reduce (уменьшать) |
|
remove_at |
RemoveAt |
resize (изменить размер) |
Resize |
reverse |
Reverse |
rfind |
LastIndexOf |
shuffle (перетасовка) |
Shuffle |
size (размер) |
Count |
slice (часть) |
Slice |
sort |
Sort (Сортировать) |
sort_custom |
|
operator != |
!RecursiveEqual |
operator + |
operator + |
operator < |
N/A |
operator <= |
N/A |
operator == |
RecursiveEqual |
operator > |
N/A |
operator >= |
N/A |
operator [] |
Индексатор Array[int] |
Словарь
Словари Godot реализованы как словарь с ключами и значениями типа Variant. В C# эквивалентный тип — Godot.Collections.Dictionary.
Универсальный тип Godot.Collections.Dictionary<TKey, TValue> позволяет ограничить типы ключей и значений до Variant-compatible type.
Нетипизированный Godot.Collections.Dictionary можно преобразовать в типизированный словарь с помощью конструктора Godot.Collections.Dictionary<TKey, TValue>(Godot.Collections.Dictionary).
Совет
Если вам нужен словарь, в котором типизирован ключ, но не значение, используйте Variant в качестве универсального параметра TValue типизированного словаря.
// The keys must be string, but the values can be any Variant-compatible type.
var dictionary = new Godot.Collections.Dictionary<string, Variant>();
Список методов словаря Godot и их эквиваленты в C#:
GDScript |
C# |
|---|---|
чисто |
Clear |
duplicate |
Дублировать |
erase |
Удалить |
find_key |
N/A |
get |
Индексатор Dictionary[Variant] или TryGetValue |
has (имеет) |
ContainsKey (Содержит ключ) |
has_all (есть все) |
N/A |
hash |
GD.Hash |
is_empty |
Использовать |
is_read_only |
IsReadOnly |
ключи |
Keys (ключи) |
make_read_only |
MakeReadOnly |
merge (слияние) |
Merge |
size (размер) |
Count |
values (ценности) |
Values |
operator != |
!RecursiveEqual |
operator == |
RecursiveEqual |
operator [] |
Индексатор Dictionary[Variant], Add или TryGetValue |