Кортежи (Tuple) — множество обобщенных классов для хранения наборов элементов с разными типами:
1 2 3 4 5 6 7 8 | public class Tuple <T1> public class Tuple <T1, T2> public class Tuple <T1, T2, T3> public class Tuple <T1, T2, T3, T4> public class Tuple <T1, T2, T3, T4, T5> public class Tuple <T1, T2, T3, T4, T5, T6> public class Tuple <T1, T2, T3, T4, T5, T6, T7> public class Tuple <T1, T2, T3, T4, T5, T6, T7, TRest> |
Каждый из них имеет свойства только для чтения с именами Item1
, Item2
и т.д. (по одному для каждого параметра типа.
Создать экземпляр кортежа можно либо с помощью его конструктора, либо с помощью статического метода Tuple.Create
:
1 2 3 | var t1 = new Tuple<int,string> (123, "Hello"); // Конструктор Tuple<int,string> t2 = Tuple.Create (123, "Hello"); // Статический метод var t = Tuple.Create (123, "Hello"); // Упрощенная версия |
После этого можно обращаться к хранящимся в кортеже данным с помощью свойств Item*
:
1 2 | Console.WriteLine (t.Item1 * 2); // 246 Console.WriteLine (t.Item2.ToUpper()); // HELLO |
Кортежи являются классами и следовательно ссылочными типами. По этой причине сравнение двух экземпляров кортежей с помощью оператора ==
вернет false
. Метод Equals
, напротив, перегружен и выполняет сравнение каждого элемента кортежа.
1 2 3 4 | var t1 = Tuple.Create (123, "Hello"); var t2 = Tuple.Create (123, "Hello"); Console.WriteLine (t1 == t2); // False Console.WriteLine (t1.Equals (t2)); // True |
Кортежи реализуют интерфейс IStructuralEquatable
, поэтому в метод Equals
можно дополнительно передать компаратор.