English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# базовый учебник

C# продвинутый учебник

C#面向对象(OOP)

Tuple (Многоэлементный массив) в C#

Класс Tuple<T> был введен в .NET Framework 4.0. Туплекс - это структура данных, содержащая последовательность элементов различного типа. Ее можно использовать в тех случаях, когда нужна структура данных для сохранения объектов с атрибутами, но не хочется создавать для них отдельные типы.

Синтаксис:

Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>

В следующем примере создается туплекс, содержащий три элемента:

Tuple<int, string, string> person = new Tuple<int, string, string>(1, "Steve", "Jobs");

В примере, приведенном выше, мы создали экземпляр Tuple, содержащий запись человека. Мы определяем тип каждого элемента и передаем значения в конструктор. Определение типа каждого элемента неудобно. C# ввел статический помощник класса Tuple, который возвращает экземпляр Tuple<T>, не требуя указания типа каждого элемента, как показано ниже.

var person = Tuple.Create(1, "Steve", "Jobs");

Кортеж может содержать до восьми элементов. При попытке включить больше восьми элементов возникает компиляторная ошибка.

var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, 8);

Доступ к элементам кортежа

Элементы кортежа можно получить через атрибут Item < elementnumber >, например Item1, Item2, Item3 и т.д., до Item7. Атрибут Item1 возвращает первый элемент, Item2 возвращает второй элемент и т.д. Последний элемент (восьмой элемент) можно получить через атрибут Rest.

var person = Tuple.Create(1, "Steve", "Jobs");
person.Item1; // возвращает 1
person.Item2; // возвращает "Steve"
person.Item3; // возвращает "Jobs"
var numbers = Tuple.Create("One", 2, 3, "Four", 5, "Six", 7, 8);
numbers.Item1; // возвращает "One"
numbers.Item2; // возвращает 2
numbers.Item3; // возвращает 3
numbers.Item4; // возвращает "Four"
numbers.Item5; // возвращает 5
numbers.Item6; // возвращает "Six"
numbers.Item7; // возвращает 7
numbers.Rest; // возвращает (8)
numbers.Rest.Item1; // возвращает 8

Обычно, восьмая позиция используется для вложенного кортежа, и вы можете получить доступ к этой позиции через атрибут Rest.

Вложенный кортеж

Если нужно включить в кортеж больше восьми элементов, можно использовать вложенный кортеж в качестве восьмого элемента. Последний вложенный кортеж можно получить через атрибут Rest. Чтобы получить элементы вложенного кортежа, используйте атрибут Rest.Item1.Item<elelementNumber>.

var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9, 10, 11, 12, 13));
numbers.Item1; // возвращает 1
numbers.Item7; // возвращает 7
numbers.Rest.Item1; // возвращает (8,9,10,11,12,13)
numbers.Rest.Item1.Item1; // возвращает 8
numbers.Rest.Item1.Item2; // возвращает 9

Вы можете включать вложенные объекты туплей в любом месте последовательности, но рекомендуется помещать вложенные тупли в конец последовательности, чтобы можно было использовать атрибут Rest для доступа к нему.

var numbers = Tuple.Create(1, 2, Tuple.Create(3, 4, 5, 6, 7, 8), 9, 10, 11, 12, 13);
numbers.Item1; // возвращает 1
numbers.Item2; // возвращает 2
numbers.Item3; // возвращает (3, 4, 5, 6, 7, 8)
numbers.Item3.Item1; // возвращает 3
numbers.Item4; // возвращает 9
numbers.Rest.Item1; // возвращает 13

Тупли в качестве параметра метода

Методы могут передавать тупли в качестве параметра.

static void Main(string[] args)
{
		var person = Tuple.Create(1, "Steve", "Jobs");
    DisplayTuple(person);
}
static void DisplayTuple(Tuple<int,string,string> person)
{
    Console.WriteLine($"Id = { person.Item1}");
    Console.WriteLine($"Имя = { person.Item2}");
    Console.WriteLine($"Фамилия = { person.Item3}");
}

Тупли в качестве типа возвращаемого значения

Тупли могут возвращаться из методов.

static void Main(string[] args)
{
		var person = GetPerson();
}
static Tuple<int, string, string> GetPerson() 
{
		return Tuple.Create(1, "Bill", "Gates");
}

Использование туплей

Тупли можно использовать в следующих случаях:

  1. Когда вы хотите вернуть несколько значений из метода, не используя параметры ref или out...

  2. Когда вы хотите передать несколько значений методу через один параметр...

  3. Когда вы хотите временно сохранить записи базы данных или某些 значения, не создавая отдельный класс...

Недостатки Tuple:

  1. Tuple является типом ссылок, а не значением. Он распределяется на стеке и может вызывать CPU-интенсивные операции.

  2. Tuple ограничен八个 элементами. Если нужно хранить больше элементов,则需要 использовать вложенные многоэлементные массивы. Но это может привести к歧ностям.

  3. Элементы Tuple можно получить через атрибуты по шаблону названия Item <elementNumber>, что не слишком разумно.

C#7 ввел ValueTuple для преодоления ограничений Tuple и для того, чтобы работа с Tuple стала более легкой. Узнайте об этом в следующей главе.