Кортежи (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 можно дополнительно передать компаратор.

