СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

Кортежи языка С#

Категория: Информатика

Нажмите, чтобы узнать подробности

Просмотр содержимого документа
«Кортежи языка С#»

Кортежи предоставляют удобный способ для работы с набором значений, который был добавлен в версии C# 7.0.

Кортеж представляет набор значений, заключенных в круглые скобки:

1

var tuple = (5, 10);

В данном случае определен кортеж tuple, который имеет два значения: 5 и 10. В дальнейшем мы можем обращаться к каждому из этих значений через поля с названиями Item[порядковый_номер_поля_в_кортеже]. Например:

1

2

3

4

5

6

7

8

9

static void Main(string[] args)

{

    var tuple = (5, 10);

    Console.WriteLine(tuple.Item1); // 5

    Console.WriteLine(tuple.Item2); // 10

    tuple.Item1 += 26;

    Console.WriteLine(tuple.Item1); // 31

    Console.Read();

}

В данном случае тип определяется неявно. Но мы ткже можем явным образом указать для переменной кортежа тип:

1

(int, int) tuple = (5, 10);

Так как кортеж содержит два числа, то в определении типа нам надо указать два числовых типа. Или другой пример определения кортежа:

1

(string, int, double) person = ("Tom", 25, 81.23);

Первый элемент кортежа в данном случае представляет строку, второй элемент - тип int, а третий - тип double.

Мы также можем дать названия полям кортежа:

1

2

3

var tuple = (count:5, sum:10);

Console.WriteLine(tuple.count); // 5

Console.WriteLine(tuple.sum); // 10

Теперь чтобы обратиться к полям кортежа используются их имена, а не названия Item1 и Item2.

Мы даже можем не использовать переменную для определения всего кортежа, а использовать отдельные переменные для его полей:

1

2

3

4

5

6

7

static void Main(string[] args)

{

    var (name, age) = ("Tom", 23);

    Console.WriteLine(name);    // Tom

    Console.WriteLine(age);     // 23

    Console.Read();

}

В этом случае с полями кортежа мы сможем работать как с переменными, которые определены в рамках метода.

Использование кортежей

Кортежи могут передаваться в качестве параметров в метод, могут быть возвращаемым результатом функции, либо использоваться иным образом.

Например, одной из распространенных ситуаций является возвращение из функции двух и более значений, в то время как функция можно возвращать только одно значение. И кортежи представляют оптимальный способ для решения этой задачи:

1

2

3

4

5

6

7

8

9

10

11

12

13

static void Main(string[] args)

{

    var tuple = GetValues();

    Console.WriteLine(tuple.Item1); // 1

    Console.WriteLine(tuple.Item2); // 3

     

    Console.Read();

}

private static (int, int) GetValues()

{

    var result = (1, 3);

    return result;

}

Здесь определен метод GetValues(), который возвращает кортеж. Кортеж определяется как набор значений, помещенных в круглые скобки. И в данном случае мы возвращаем кортеж из двух элементов типа int, то есть два числа.

Другой пример:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

static void Main(string[] args)

{

    var tuple = GetNamedValues(new int[]{ 1,2,3,4,5,6,7});

    Console.WriteLine(tuple.count);

    Console.WriteLine(tuple.sum);

     

    Console.Read();

}

private static (int sum, int count) GetNamedValues(int[] numbers)

{

    var result = (sum:0, count: 0);

    for (int i=0; i

    {

        result.sum += numbers[i];

        result.count++;

    }

    return result;

}

И также кортеж может передаваться в качестве параметра в метод:

1

2

3

4

5

6

7

8

9

10

11

12

13

static void Main(string[] args)

{

    var (name, age) = GetTuple(("Tom", 23), 12);

    Console.WriteLine(name);    // Tom

    Console.WriteLine(age);     // 35

    Console.Read();

}

         

private static (string name, int age) GetTuple((string n, int a) tuple, int x)

{

    var result = (name: tuple.n, age: tuple.a + x);

    return result;

}