C# Класс Array

Массивы в C#

Класс Array является базовым классом для всех массивов в C# и определён в пространстве имён System. Класс Array предоставляет различные свойства и методы для массивов.

В C# класс Array является базовым классом для всех массивов и находится в пространстве имён System.

Массив — это коллекция, используемая для хранения фиксированного числа элементов одного типа. Понимание характеристик и методов класса Array очень важно для написания эффективных программ на C#.

Ниже приведено подробное введение в класс Array в C#, включая его характеристики, часто используемые методы, свойства и примеры использования.

Особенности

  • Безопасность типов: Массивы могут хранить только элементы указанного типа, и тип определяется во время объявления.
  • Фиксированная длина: Длину массива нельзя изменить после его создания.
  • Доступ по индексу: Элементы массива доступны по индексу, и индекс начинается с 0.
  • Поддержка многомерных массивов: C# поддерживает одномерные, многомерные и зубчатые массивы (массивы массивов).

Свойства класса Array

В следующей таблице перечислены некоторые из наиболее часто используемых свойств класса Array:

Имя атрибутаОписаниеПример кодаВывод
ДлинаВозвращает общее число элементов в массиве.int[] arr = {1, 2, 3};
int length = arr.Length;
3
RankВозвращает ранг массива (т. е. число измерений массива).int[,] matrix = new int[2, 3];
int rank = matrix.Rank;
2
IsFixedSizeОпределяет, является ли размер массива фиксированным.int[] arr = {1, 2, 3};
bool fixedSize = arr.IsFixedSize;
true
IsReadOnlyОпределяет, доступен ли массив только для чтения.int[] arr = {1, 2, 3};
bool readOnly = arr.IsReadOnly;
false
IsSynchronizedОпределяет, является ли массив потокобезопасным.int[] arr = {1, 2, 3};
bool sync = arr.IsSynchronized;
false
SyncRootВозвращает объект, используемый для синхронизации доступа к массиву, обычно применяется в многопоточных операциях.int[] arr = {1, 2, 3};
object syncRoot = arr.SyncRoot;
syncRoot

Полный список свойств класса Array см. в документации Microsoft по C#.

Методы класса Array

В следующей таблице перечислены некоторые из наиболее часто используемых методов класса Array:

Порядковый номерМетоды и описание
1Понятно
Устанавливает диапазон элементов массива в ноль, false или null в зависимости от типа элемента.
2Copy(Array, Array, Int32)
Копирует диапазон элементов из массива, начиная с первого элемента, в позицию первого элемента другого массива. Длина задаётся 32-битным целым числом.
3CopyTo(Array, Int32)
Копирует все элементы из текущего одномерного массива в указанную позицию индекса в указанном одномерном массиве. Индекс задаётся 32-битным целым числом.
4GetLength
Возвращает 32-битное целое число, представляющее общее количество элементов в указанном измерении массива.
5GetLongLength
Возвращает 64-битное целое число, представляющее общее количество элементов в указанном измерении массива.
6GetLowerBound
Возвращает нижнюю границу указанного измерения в массиве.
7GetType
Возвращает тип текущего экземпляра. Наследуется от Object.
8GetUpperBound
Возвращает верхнюю границу указанного измерения в массиве.
9GetValue(Int32)
Возвращает значение в указанной позиции в одномерном массиве. Индекс задается 32-битным целым числом.
10IndexOf(Array, Object)
Ищет указанный объект и возвращает индекс его первого вхождения во всем одномерном массиве.
11Reverse(Array)
Меняет порядок элементов на обратный во всем одномерном массиве.
12SetValue(Object, Int32)
Задает значение элемента в указанной позиции в одномерном массиве. Индекс задается 32-битным целым числом.
13Sort(Array)
Сортирует элементы во всем одномерном массиве, используя реализацию IComparable каждого элемента массива.
14ToString
Возвращает строку, представляющую текущий объект. Унаследовано от Object.

Дополнительные примечания к справочнику методов

  1. AsReadOnly<T>(T[])

    • Возвращает оболочку только для чтения для указанного массива.
  2. BinarySearch

    • BinarySearch(Array, Int32, Int32, Object, IComparer): Выполняет поиск значения в отсортированном массиве с использованием указанногоIComparerИнтерфейс.
    • BinarySearch(Array, Int32, Int32, Object): Выполняет поиск значения в отсортированном массиве с использованиемIComparableИнтерфейс.
    • BinarySearch(Array, Object, IComparer): Выполняет поиск в отсортированном массиве с использованием указанногоIComparerИнтерфейс.
    • BinarySearch(Array, Object): Выполняет поиск в отсортированном массиве с использованиемIComparableИнтерфейс.
    • BinarySearch<T>(T[], Int32, Int32, T, IComparer<T>): Выполняет поиск значения в диапазоне обобщенного массива с использованием указанногоIComparer<T>Интерфейс.
    • BinarySearch<T>(T[], Int32, Int32, T): Выполняет поиск значения в диапазоне обобщенного массива с использованиемIComparable<T>Интерфейс.
    • BinarySearch<T>(T[], T, IComparer<T>): Выполняет поиск в отсортированном обобщенном массиве с использованием указанногоIComparer<T>Интерфейс.
    • BinarySearch<T>(T[], T): Выполняет поиск в отсортированном обобщенном массиве с использованиемIComparable<T>Интерфейс.
  3. Понятно

    • Clear(Array, Int32, Int32): Присваивает элементам в указанном диапазоне массива значения по умолчанию.
    • Clear(Array): Очищает содержимое массива.
  4. Clone

    • Создаёт поверхностную копию массива.
  5. ConstrainedCopy

    • Копирует указанный диапазон элементов из исходного массива в целевой массив, гарантируя, что изменения вносятся только после успешного завершения всей операции копирования.
  6. ConvertAll<TInput, TOutput>(TInput[], Converter<TInput, TOutput>)

    • Преобразует массив одного типа в массив другого типа.
  7. Copy

    • Copy(Array, Array, Int32): Копирует элементы массива в целевой массив, при этом длина задаётся 32-битным целым числом.
    • Copy(Array, Array, Int64): Копирует элементы массива в целевой массив, при этом длина задаётся 64-битным целым числом.
    • Copy(Array, Int32, Array, Int32, Int32): Копирует указанный диапазон элементов из исходного массива в целевой массив.
    • Copy(Array, Int64, Array, Int64, Int64): Копирует указанный диапазон элементов из исходного массива в целевой массив.
    • CopyTo(Array, Int32): Копирует текущий массив в целевой массив, указывая позицию индекса в целевом массиве, с которой следует начать.
    • CopyTo(Array, Int64): То же, что выше, но индекс задаётся 64-битным целым числом.
  8. CreateInstance

    • CreateInstance(Type, Int32): Создаёт одномерный массив указанного типа и длины.
    • CreateInstance(Type, Int32, Int32): Создаёт двумерный массив.
    • CreateInstance(Type, Int32, Int32, Int32): Создаёт трёхмерный массив.
    • CreateInstance(Type, Int32[]): Создаёт многомерный массив с указанными размерностями.
    • CreateInstance(Type, Int64[]): Создаёт многомерный массив с использованием 64-битных целочисленных размерностей.
  9. Empty<T>

    • Возвращает экземпляр пустого массива.
  10. Exists<T>(T[], Predicate<T>)

    • Определяет, содержит ли массив элементы, удовлетворяющие указанному условию.
  11. Fill<T>(T[], T, Int32, Int32)

    • Заполняет все элементы массива в указанном диапазоне индексов заданным значением.
    • Fill<T>(T[], T): Заполняет все элементы всего массива заданным значением.
  12. Find

    • Find<T>(T[], Predicate<T>): Ищет первый элемент, соответствующий условиям, и возвращает его.
    • FindAll<T>(T[], Predicate<T>): Возвращает все элементы, соответствующие условиям.
    • FindIndex<T>(T[], Int32, Int32, Predicate<T>): В указанном диапазоне массива возвращает индекс первого элемента, удовлетворяющего условию.
    • FindIndex<T>(T[], Int32, Predicate<T>): После указанного индекса возвращает индекс первого элемента, удовлетворяющего условию.
    • FindIndex<T>(T[], Predicate<T>): Возвращает индекс первого элемента, удовлетворяющего условию.
    • FindLast<T>(T[], Predicate<T>): Возвращает последний элемент, удовлетворяющий условию.
    • FindLastIndex<T>(T[], Int32, Int32, Predicate<T>): В указанном диапазоне массива возвращает индекс последнего элемента, удовлетворяющего условию.
    • FindLastIndex<T>(T[], Predicate<T>): Возвращает индекс последнего элемента, удовлетворяющего условию.
  13. ForEach<T>(T[], Action<T>)

    • Выполняет указанную операцию над каждым элементом массива.
  14. GetEnumerator()

    • Возвращает перечислитель массива.
  15. GetLength

    • GetLength(Int32): Возвращает число элементов в указанном измерении массива.
  16. GetLongLength(Int32)

    • Возвращает длину массива в виде 64-битного целого числа.
  17. GetLowerBound(Int32)

    • Возвращает индекс первого элемента в указанном измерении массива.
  18. GetUpperBound(Int32)

    • Возвращает индекс последнего элемента в указанном измерении массива.
  19. GetValue

    • GetValue(Int32): Возвращает значение по указанному индексу одномерного массива.
    • GetValue(Int32, Int32): Возвращает значение по указанному индексу двумерного массива.
    • GetValue(Int32, Int32, Int32): Возвращает значение по указанному индексу трехмерного массива.
    • GetValue(Int32[]): Возвращает значение многомерного массива.
  20. IndexOf

    • IndexOf(Array, Object): Возвращает индекс первого вхождения указанного объекта.
    • IndexOf(Array, Object, Int32): Возвращает индекс первого вхождения указанного объекта в заданном диапазоне массива.
    • IndexOf(Array, Object, Int32, Int32): Возвращает индекс первого вхождения указанного объекта в указанном диапазоне массива.
  21. LastIndexOf

    • аналогичноIndexOf, но выполняет поиск с конца массива.
  22. Resize<T>(T[], Int32)

    • Изменяет размер одномерного массива.
  23. Reverse

    • Reverse(Array): Изменяет порядок элементов в массиве на обратный.
    • Reverse<T>(T[]): Изменяет порядок элементов в обобщённом массиве на обратный.
  24. SetValue

    • SetValue(Object, Int32): Задает значение по указанному индексу массива.
    • SetValue(Object, Int32, Int32): Задает значение в указанной позиции двумерного массива.
  25. Sort

    • Sort(Array): Сортирует массив.
    • Sort<T>(T[], IComparer<T>): Сортирует обобщенный массив.
  26. TrueForAll<T>(T[], Predicate<T>)

    • Определяет, все ли элементы массива удовлетворяют условию.

Полный список методов класса Array приведен в документации Microsoft по C#.

Пример

Следующая программа демонстрирует использование некоторых методов класса Array:

Пример

using System;
namespace ArrayApplication
{
    class MyArray
    {
       
        static void Main(string[] args)
        {
            int[] list = { 34, 72, 13, 44, 25, 30, 10 };

            Console.Write("Исходный массив: ");
            foreach (int i in list)
            {
                Console.Write(i + " ");
            }
            Console.WriteLine();
           
            // Обратный порядок массива
            Array.Reverse(list);
            Console.Write("Массив в обратном порядке: ");
            foreach (int i in list)
            {
                Console.Write(i + " ");
            }
            Console.WriteLine();
           
            // Сортировка массива
            Array.Sort(list);
            Console.Write("Отсортированный массив: ");
            foreach (int i in list)
            {
                Console.Write(i + " ");
            }
            Console.WriteLine();

           Console.ReadKey();
        }
    }
}

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

原始数组: 34 72 13 44 25 30 10
逆转数组: 10 30 25 44 13 72 34
排序数组: 10 13 25 30 34 44 72

Примеры распространённых методов

1. Array.Clear(Array, int index, int length)

Устанавливает для указанного диапазона элементов массива значение по умолчанию для их типа.

int[] arr = {1, 2, 3, 4, 5};
Array.Clear(arr, 1, 2); // arr = {1, 0, 0, 4, 5}

2. Array.Copy(Array sourceArray, Array destinationArray, int length)

Копирует элементы из исходного массива в массив назначения.

int[] source = {1, 2, 3};
int[] destination = new int[3];
Array.Copy(source, destination, 3); // destination = {1, 2, 3}

3. Array.Clone()

Создаёт поверхностную копию массива.

int[] arr = {1, 2, 3};
int[] clonedArr = (int[])arr.Clone();

4. Array.IndexOf(Array array, object value)

Возвращает индекс первого вхождения указанного элемента в одномерном массиве.

int[] arr = {1, 2, 3, 2};
int index = Array.IndexOf(arr, 2); // index = 1

5. Array.LastIndexOf(Array array, object value)

Возвращает индекс последнего вхождения указанного элемента в одномерном массиве.

int[] arr = {1, 2, 3, 2};
int lastIndex = Array.LastIndexOf(arr, 2); // lastIndex = 3

6. Array.Reverse(Array array)

Изменяет порядок элементов в одномерном массиве на обратный.

int[] arr = {1, 2, 3};
Array.Reverse(arr); // arr = {3, 2, 1}

7. Array.Sort(Array array)

Сортирует элементы одномерного массива по возрастанию.

int[] arr = {3, 1, 2};
Array.Sort(arr); // arr = {1, 2, 3}

8. Array.BinarySearch(Array array, object value)

Выполняет поиск элемента в отсортированном одномерном массиве и возвращает его индекс.

int[] arr = {1, 2, 3, 4, 5};
int index = Array.BinarySearch(arr, 3); // index = 2

Примечание:Перед использованием BinarySearch массив уже должен быть отсортирован.

9. Array.Resize(ref T[] array, int newSize)

Изменяет размер одномерного массива.

int[] arr = {1, 2, 3};
Array.Resize(ref arr, 5); // arr = {1, 2, 3, 0, 0}

10. Array.Exists<T>(T[] array, Predicate match)

Определяет, есть ли в массиве элемент, удовлетворяющий условию.

int[] arr = {1, 2, 3};
bool exists = Array.Exists(arr, x => x == 2); // exists = true

11. Array.Find<T>(T[] array, Predicate match)

Находит первый элемент в массиве, удовлетворяющий условию.

int[] arr = {1, 2, 3, 4};
int result = Array.Find(arr, x => x > 2); // result = 3

12. Array.FindAll<T>(T[] array, Predicate match)

Находит все элементы в массиве, удовлетворяющие условию.

int[] arr = {1, 2, 3, 4};
int[] results = Array.FindAll(arr, x => x > 2); // results = {3, 4}

13. Array.FindIndex<T>(T[] array, Predicate match)

Возвращает индекс первого элемента, удовлетворяющего условию.

int[] arr = {1, 2, 3, 4};
int index = Array.FindIndex(arr, x => x > 2); // index = 2

14. Array.FindLast<T>(T[] array, Predicate match)

Находит последний элемент, соответствующий условиям.

int[] arr = {1, 2, 3, 4};
int result = Array.FindLast(arr, x => x > 2); // result = 4

15. Array.FindLastIndex<T>(T[] array, Predicate match)

Возвращает индекс последнего элемента, удовлетворяющего условию.

int[] arr = {1, 2, 3, 4};
int index = Array.FindLastIndex(arr, x => x > 2); // index = 3

16. Array.TrueForAll<T>(T[] array, Predicate match)

Определяет, удовлетворяют ли все элементы массива условию.

int[] arr = {1, 2, 3};
bool allPositive = Array.TrueForAll(arr, x => x > 0); // allPositive = true

17. Array.ForEach<T>(T[] array, Action action)

Выполняет указанную операцию над каждым элементом массива.

int[] arr = {1, 2, 3};
Array.ForEach(arr, x => Console.WriteLine(x)); // 输出 1 2 3

18. Array.ConstrainedCopy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length)

Копирует часть массива в другой массив и гарантирует, что при сбое копирования не произойдёт повреждение данных.
int[] source = {1, 2, 3, 4, 5};
int[] destination = new int[5];
Array.ConstrainedCopy(source, 0, destination, 0, 5);

19. Array.Fill<T>(T[] array, T value)

Устанавливает для всех элементов массива указанное значение.

int[] arr = new int[5];
Array.Fill(arr, 10); // arr = {10, 10, 10, 10, 10}

20. Array.AsReadOnly<T>(T[] array)

Возвращает оболочку массива только для чтения.

int[] arr = {1, 2, 3};
var readOnlyArr = Array.AsReadOnly(arr);
// readOnlyArr[0] = 5; // 编译错误,集合是只读的

Пример

using System;

class Program
{
    static void Main()
    {
        // Создать и инициализировать массив
        int[] numbers = {5, 2, 8, 1, 3};

        // Сортировка массива
        Array.Sort(numbers); // numbers = {1, 2, 3, 5, 8}

        // Найти элемент
        int index = Array.BinarySearch(numbers, 5); // index = 3

        // Обратный порядок массива
        Array.Reverse(numbers); // numbers = {8, 5, 3, 2, 1}

        // Проверить, есть ли элементы больше 6
        bool exists = Array.Exists(numbers, x => x > 6); // exists = true

        // Умножить элементы массива на 2
        Array.ForEach(numbers, x => Console.WriteLine(x * 2));

        // Изменить размер массива
        Array.Resize(ref numbers, 7); // numbers = {8, 5, 3, 2, 1, 0, 0}

        // Заполнить новые элементы
        Array.Fill(numbers, 10, 5, 2); // Установить 2 элемента, начиная с индекса 5, в 10
        // numbers = {8, 5, 3, 2, 1, 10, 10}
    }
}

Массивы в C#

Другие расширения