Що таке кортеж C

Що таке кортеж C



Застосування кортежів C#

Мова програмування С# є одним із найсучасніших на сьогоднішній день. Створено групою вчених-інженерів компанії Microsoft під керівництвом Андерса Хейлсберга. Застосовується для платформи Microsoft .NET. Це відносно молода мова, перша версія якої з'явилася 2002 року. Поточна C# 7.0 вийшла у 2017 році.

Ця мова програмування є мовою з С-подібним синтаксисом, що має досить стриману типізацію, що підтримує успадкування, поліморфізм, навантаження операторів та інші функції та властивості.

Оновлений тип Tuple

Одне з важливих покращень мови програмування С# торкнулося роботи з кортежами типу Tuple. Раніше ці елементи були настільки популярні з низки причин:

  • масштабність та складність конструкції;
  • мінімальна читабельність коду через стандартні, безглузді імена властивостей Item.

Дуже часто замість Tuple формувався окремий клас, що значною мірою збільшувало масивність коду. У ряді випадків застосовували вихідні параметри out, але це робило способи незручними для застосування.

public Tuple GetCoords()

return new Tuple(valueX, valueY);

З введенням в експлуатацію С#7 усі перелічені проблеми самоусунулися, а можливість розширилися:

  • тепер можна використовувати скорочений запис, вказавши в круглих дужках типи, що використовуються при визначенні і значенні при формуванні Tuple;
  • додатково існує можливість задавати власні імена та використовувати їх у підказках при виборі властивостей.

public (double X, double Y) GetCoords()

return (valueX, valueY);

Якщо порівнювати, можна помітити, що з створенні другого варіанта не використовується «new». Однак додатково стають доступними:

Обговорення всіх переваг оновленого типу Tuple ви можете знайти у нашому блозі DevEducation і також висловити свою думку чи поставити запитання.

Кортежі можуть передаватися як параметри в метод, стати елементами функцій, що повертаються, використовуватися іншими способами.Наприклад, одним із найпопулярніших варіантів вважається повернення з функції кількох значень, тоді як зазвичай можна повернути лише одне. Кортеж можна позначити як комбінацію елементів, що знаходяться в округлих дужках.

Головна відмінність масивів від кортежів у тому, останні можуть з'єднувати, акумулювати об'єкти різних типів. Запитувати кожен елемент кортежу можна за допомогою підлоги з найменуваннями:

Передбачено кілька різних узагальнень класу Tuple для підтримки безлічі елементів (більше 8), що включаються до кортежу. Також можна використовувати визначення класу Tuple для 8 параметрів, останній з яких називається TRest. У ньому і переміщається сам кортеж.

Також існує можливість назвати поля кортежу, наприклад:

  • var tuple = (count:5, sum:10);
  • Console.WriteLine(tuple.count); // 5
  • onsole.WriteLine(tuple.sum); //10.

Щоб звернутися до кожного поля, тепер потрібно використовувати ім'я, а не назву.

Визначення з Вікіпедії: «Кортеж – впорядкований набір фіксованої довжини». Ємне і точне визначення абсолютно незрозуміле непосвяченим.

У Вікіпедії немає згадки про те, що сам собою кортеж – це структура часу компіляції. Тобто певна сутність, що поєднує розрізнені об'єкти на етапі компіляції. Не виражено кортежі, власне кажучи, використовують у багатьох мовах програмування. Це ви зрозумієте, якщо поставите питання про те, як вивчити мову програмування, і запишетесь на курси програмування DevEducation для новачків і тих, хто хоче підвищити свою кваліфікацію.

Деякі з кортежів можуть містити лише незмінні об'єкти, інші можуть змінюватися. До останніх входять, наприклад, списки. Однак програмісти Python активно обговорюють цю тему і більшість з них абсолютно впевнені в тому, що кортежі можуть бути змінними.

Основні властивості даних елементів полягають у наступному:

  • користувач не має права вставляти у них сторонні деталі;
  • не можна міняти навіть на ці аналогічні елементи;
  • знайти потрібний сегмент у кортежі можна, але на процес роботи це не вплине;
  • Для перевірки присутності того чи іншого елемента у кортежі рекомендується використовувати пошуковий оператор in.

Класичні опції з кортежами

  • індекс будь-якого початкового елемента кортежу завжди застосовується "0", його можна укладати у квадратні дужки;
  • об'єднання спрямоване формування нового об'єкта, тобто, конкатенації два кортежу;
  • перемноження передбачає, що той самий кортеж перераховується кілька разів;
  • у кортежів немає методів append(), remove(), extend(), insert() або pop(), оскільки вони незмінні, проте є count() і len(), що повертають число повторень і позиціонує інтерв'ю елементів;
  • кортежам надається кілька значень по черзі, що дуже зручно для присвоєння певної кількості змінних.

Основи взаємодії з кортежами

Перший етап – створення. Як і інші колекції мови Пітон, кортежі створюються двома способами: літерального оголошення та із застосуванням функції tuple(). Далі слідує упаковка - присвоєння кортежу певної змінної. На цьому етапі враховують 2 основні моменти:

  • Вирази some_tuple = (11, 12, 13) та some_tuple = 11, 12, 13 є аналогічними.
  • Для оголошення кортежу, в якому передбачено лише один елемент, необхідно використовувати кінцеву кому.

Далі йде розпакування, коли певним елементам кортежу присвоюються конкретні значення. Числовий параметр змінних повинен відповідати кількості елементів tuple.

Знайти конкретний елемент та пошук у кортежі можна за номером його позиції з початку чи з кінця. Якщо елемент є вкладеним кортежем, то використовуються квадратні дужки. Відсортувати готовий кортеж можна за допомогою функції sorted(). Якщо ви збираєтеся видалити частину кортежу, зробити це неможливо, але можна повністю його стерти за допомогою оператора del.

Деконструкція кортежів та інших типів

Кортеж дозволяє легко отримати кілька значень при виклику методу. Але після отримання кортежу вам потрібно буде обробити окремі елементи. Робота з елементом елемента є громіздкою, як показано в наступному прикладі. Метод QueryCityData повертає три кортежі, і кожне з його елементів призначається змінною окремою операцією.

public class Example < public static void Main() < var result = QueryCityData("New York City"); var city = result.Item1; var pop = result.Item2; var size = result.Item3; // Do something with the data. >private static (string, int, double) QueryCityData(string name) < if (name == "New York City") return (name, 8175133, 468.48); return ("", 0, 0); >>

Отримання кількох значень полів і властивостей об'єкта може бути громіздким: необхідно призначити значення поля або властивості змінної на основі елемента.

Можна витягти кілька елементів з кортежу або отримати кілька полів, властивостей і значень, що обчислюються, з об'єкта в одній деконструкційної операції. Щоб деконструювати кортеж, потрібно призначити його елементи окремим змінним. При деконструкції об'єкта ви надаєте окремим змінним вибрані значення.

Кортежі

Мова C# має вбудовану підтримку деконструкції кортежів, яка дозволяє витягувати з кортежу всі елементи за операцію. Загальний синтаксис деконструкції кортежу нагадує синтаксис визначення: змінні, яким будуть присвоєні елементи кортежу, вказуються в круглих дужках у лівій частині оператора присвоювання. Наприклад, наступна інструкція призначає елементи чотирьох кортежів чотирьом окремим змінним:

var (name, address, city, zip) = contact.GetAddressInfo();

Існує три способи деконструкції кортежу:

    Ви можете явно оголосити тип кожного поля у дужках. У наступному прикладі цей підхід використовується для деконструкції трьох кортежів, які повертаються методом QueryCityData.

public static void Main() < (string city, int population, double area) = QueryCityData("New York City"); // Do something with the data. >
public static void Main() < var (city, population, area) = QueryCityData("New York City"); // Do something with the data. >

Крім того, ви можете використовувати ключове слово var при оголошенні окремих або всіх змінних усередині дужок.

public static void Main() < (string city, var population, var area) = QueryCityData("New York City"); // Do something with the data. >
public static void Main() < string city = "Raleigh"; int population = 458880; double area = 144.8; (City, population, area) = QueryCityData("New York City"); // Do something with the data. >
public static void Main() < string city = "Raleigh"; int population = 458880; (City, population, double area) = QueryCityData("New York City"); // Do something with the data. >

Не можна вказати певний тип поза круглими дужками, навіть якщо кожне поле у ​​кортежі має однаковий тип. Це призводить до помилки компілятора CS8136, "Деконструкція "var (. )" форми забороняє певний тип для var".

Необхідно призначити кожному елементу змінного кортежу. Якщо ви опустите елементи, компілятор створює помилку CS8132: "Не вдалося деконструювати кортеж елементів x у змінні y".

Елементи кортежу зі скасуванням

При деконструкції кортежу нас цікавлять значення лише деяких елементів. Ви можете скористатись підтримкою C# для відкидання, які є змінними, призначеними лише для запису, значення яких ви вирішили ігнорувати. Ви оголошуєте скасування символом підкреслення ("_") у призначенні. Ви можете відкинути стільки значень, скільки вам подобається; один покидьок, _ , представляє всі відкинуті значення.

У наступному прикладі показано використання кортежів із порожніми змінними.Метод QueryCityDataForYears повертає шість кортежів з ім'ям міста, його районом, роком, населення міста протягом цього року, другий рік та населення міста протягом цього другого року. У прикладі показано зміну чисельності населення за ці два роки. З доступних у кортежі даних нас не цікавить площа міста, а назва міста та дві дати відомі нам вже на етапі розробки. Отже, нас цікавлять лише два значення чисельності населення, які зберігаються у кортежі. Інші значення можна обробити як порожні змінні.

using System; public class ExampleDiscard < public static void Main() < var (_, _, _, pop1, _, pop2) = QueryCityDataForYears("New York City", 1960, 2010); Console.WriteLine($"Population change, 1960 to 2010: "); > private static (string, double, int, int, int, int) QueryCityDataForYears(string name, int year1, int year2) < int population1 = 0, population2 = 0; double area = 0; if (name == "New York City") < area = 468.48; if (year1 == 1960) < population1 = 7781984; >if (year2 == 2010) < population2 = 8175133; >return (name, area, year1, population1, year2, population2); > return ("", 0, 0, 0, 0, 0); > > // The example displays following output: // Population change, 1960 to 2010: 393,149

Визначаються користувачем типи

C# надає вбудовану підтримку деконструкції типів кортежів, record та типів DictionaryEntry. Проте, якщо ви є творцем класу, структури або інтерфейсу, ви можете дозволити деконструкцію екземплярів певного типу, реалізувавши один або кілька методів Deconstruct . Метод повертає нічого (Void). Параметр у сигнатурі методу представляє кожне значення для деконструювання. Наприклад, наступний метод Deconstruct класу Person повертає перше, середнє та сімейне ім'я:

public void Deconstruct(out string fname, out string mname, out string lname)

Потім можна деконструювати екземпляр Person класу з ім'ям p призначення, як показано в наступному коді:

var(fName, mName, lName) = p;

У наступному прикладі показано перевантаження методу Deconstruct повернення різних поєднань властивостей об'єкта Person . Окремі навантаження повертають такі значення:

  • Ім'я першого та сімейного імені.
  • Перше, середнє та сімейне ім'я.
  • Ім'я, ім'я сім'ї, ім'я міста та ім'я штату.
using System; public class Person < public string FirstName < get; set; >public string MiddleName < get; set; >public string LastName < get; set; >public string City < get; set; >public string State < get; set; >public Person(string fname, string mname, string lname, string cityName, string stateName) < FirstName = fname; MiddleName = mname; LastName = lname; City = cityName; State = stateName; >// Return the first and last name. public void Deconstruct(out string fname, out string lname) < fname = FirstName; lname = LastName; >public void Deconstruct(out string fname, out string mname, out string lname) < fname = FirstName; mname = MiddleName; lname = LastName; >public void Deconstruct(out string fname, out string lname, out string city, out string state) < fname = FirstName; lname = LastName; city ​​= City; state = State; >> public class ExampleClassDeconstruction < public static void Main() < var p = new Person("John", "Quincy", "Adams", "Boston", "MA"); // Deconstruct the person object. var(fName, lName, city, state) = p; Console.WriteLine($"Hello of , !"); > > // The example displays following output: // Hello John Adams of Boston, MA!

Декілька методів Deconstruct з однаковим числом параметрів вносять плутанину. Намагайтеся визначати методи Deconstruct з різним числом параметрів чи аргументів. Deconstruct методи з однаковим числом параметрів не можна розрізнити при дозволі навантаження.

Визначається користувачем тип скасування

Як і з кортежами, порожні змінні можна застосовувати з типами користувача, щоб ігнорувати певні елементи, що повертаються методом Deconstruct . Змінна з іменем "_" представляє скасування.Одна операція деконструкції може містити одне або кілька відкидань.

Наступний приклад деконструює об'єкт Person на чотири рядки (ім'я та прізвище, місто та штат), але відкидає прізвище та штат.

// Deconstruct the person object. var(fName, _, city, _) = p; Console.WriteLine($"Hello of !"); // The example displays following output: // Hello John of Boston!

Методи деконструкції розширення

Якщо ви не є творцем класу, структури або інтерфейсу, ви все одно можете виконувати деконструкцію об'єктів цього типу, реалізувавши один або кілька Deconstruct методів розширення, які повертатимуть значення, що вас цікавлять.

У наведеному нижче прикладі визначено два методи розширення Deconstruct для класу System.Reflection.PropertyInfo. Перший повертає набір значень, що вказують властивості. Другий спосіб показує рівень доступу якості. Логічні значення вказують, чи має властивість окремі методи отримання та завдання доступу чи різні спеціальні можливості. Якщо є тільки один метод доступу або як метод отримання, так і набір доступу мають однакові спеціальні можливості, змінна access вказує на доступність властивості в цілому. В іншому випадку доступність методів читання та запису вказується змінними getAccess та setAccess.

using System; використовуючи System.Collections.Generic; використовуючи System.Reflection; public static class ReflectionExtensions < public static void Deconstruct(this PropertyInfo p, out bool isStatic, out bool isReadOnly, out bool isIndexed, out Type propertyType) < var getter = p.GetMethod; // Is the property read-only? isReadOnly = ! p.CanWrite; // Is the property instance or static? isStatic = getter.IsStatic; // Is the property indexed? isIndexed = p.GetIndexParameters().Length >0; // Get the property type.propertyType = p.PropertyType; > public static void Deconstruct(this PropertyInfo p, out bool hasGetAndSet, out bool sameAccess, out string access, out string getAccess, out string setAccess) < hasGetAndSet = sameAccess = false; string getAccessTemp = null; string setAccessTemp = null; MethodInfo getter = null; if (p.CanRead) getter = p.GetMethod; MethodInfo setter = null; if (p.CanWrite) setter = p.SetMethod; if (setter != null && getter != null) hasGetAndSet = true; if (getter! = null) < if (getter.IsPublic) getAccessTemp = "public"; else if (getter.IsPrivate) getAccessTemp = "private"; else if (getter.IsAssembly) getAccessTemp = "internal"; else if (getter.IsFamily) getAccessTemp = "protected"; else if (getter.IsFamilyOrAssembly) getAccessTemp = "protected internal"; >if (setter! = null) < if (setter.IsPublic) setAccessTemp = "public"; else if (setter.IsPrivate) setAccessTemp = "private"; else if (setter.IsAssembly) setAccessTemp = "internal"; else if (setter.IsFamily) setAccessTemp = "protected"; else if (setter.IsFamilyOrAssembly) setAccessTemp = "protected internal"; >// Are the accessibility of the getter and setter the same? if (setAccessTemp == getAccessTemp) < sameAccess = true; access = getAccessTemp; getAccess = setAccess = String.Empty; >else <access = null; getAccess = getAccessTemp; setAccess = setAccessTemp; >> > public class ExampleExtension < public static void Main() < Type dateType = typeof(DateTime); PropertyInfo prop = dateType.GetProperty("Now"); var (isStatic, isRO, isIndexed, propType) = prop; Console.WriteLine($"\nThe . property:"); Console.WriteLine($" PropertyType: "); Console.WriteLine($"Static:"); Console.WriteLine($" Read-only: "); Console.WriteLine($" Indexed: "); Type listType = typeof(List<>); prop = listType.GetProperty("Item", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); var (hasGetAndSet, sameAccess, accessibility, getAccessibility, setAccessibility) = prop;Console.Write($"\nAccessibility of the . property: "); if (! hasGetAndSet | sameAccess) < Console.WriteLine(accessibility); >else < Console.WriteLine($"\n The get accessor: "); Console.WriteLine($" The set accessor: "); > > > // Відомості про те, що наступний вихід: // The System.DateTime.Now property: // PropertyType: DateTime // Static: True // Read-only: True // Indexed: False // // Accessibility of the System.Collections.Generic.List`1.Item property: public

Метод розширення для системних типів

Dictionary snapshotCommitMap = new(StringComparer.OrdinalIgnoreCase) < ["https://github.com/dotnet/docs"] = 16_465, ["https://github.com/dotnet/runtime"] = 114_223, ["https: //github.com/dotnet/installer"] = 22_436, ["https://github.com/dotnet/roslyn"] = 79_484, ["https://github.com/dotnet/aspnetcore"] = 48_386 > ; foreach (var (repo, commitCount) в snapshotCommitMap) < Console.WriteLine( $"The repository had commits as of November 10th, 2021."); >

record Типи

При оголошенні типу record за допомогою двох позиційних параметрів або більше, компілятор створює метод Deconstruct з параметром out для кожного позиційного параметра в оголошенні record. Для отримання додаткових відомостей див. Позиційний синтаксис для визначення якості та Поводження деконструктора у похідних записах.

також

Джерело цього вмісту можна знайти на GitHub, де також можна створювати та переглядати проблеми та запити на витягування. Для отримання додаткових відомостей див. посібник для учасників.

Типи кортежів (довідник за C#)

Функція кортежів надає короткий синтаксис для угруповання кількох елементів даних у спрощеній структурі даних. У наступному прикладі показано, як можна оголосити змінну кортежу, ініціалізувати її та отримати доступ до її елементів даних.

(double, int) t1 = (4.5, 3); Console.WriteLine($"Tuple with elements and ."); // Output: // Tuple with elements 4.5 and 3.(Double Sum, int Count) t2 = (4.5, 3); Console.WriteLine($"Sum of elements is ."); // Output: // Sum of 3 elements is 4.5.

Як показано в попередньому прикладі, для визначення типу кортежу необхідно вказати типи всіх елементів даних і, при необхідності, імена полів. Неможливо визначити методи в типі кортежу, але можна використовувати методи, що надаються .NET, як показано в наступному прикладі:

(double, int) t = (4.5, 3); Console.WriteLine(t.ToString()); Console.WriteLine($"Hash code of is."); // Output: // (4.5, 3) // Hash code of (4.5, 3) is 718460086.

Типи кортежів підтримують оператори == рівності та != . Щоб отримати додаткові відомості, див. Рівність кортежів.

Типи кортежів є типами значень, а елементи кортежу загальнодоступними полями. Тому кортежі є змінювані типи значень.

Можна визначити кортежі зі скільки завгодно великою кількістю елементів.

var t = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26); Console.WriteLine(t.Item26); // output: 26

Варіанти використання кортежів

Найчастіше кортежі використовуються як тип, що повертається методом. Тобто замість визначення параметрів методу out можна згрупувати результати методу в тип кортежу, що повертається, як показано в наступному прикладі.

int[] xs = new int[] <4, 7, 9>; var limits = FindMinMax(xs); Console.WriteLine($"Limits of [] are and "); // Output: // Limits of [4 7 9] are 4 and 9 int[] ys = new int[] < -9, 0, 67, 100 >; var (minimum, maximum) = FindMinMax(ys); Console.WriteLine($"Limits of [] are and "); // Output: // Limits of [-9 0 67 100] are -9 and 100 (int min, int max) FindMinMax(int[] input) < if (input is null || input. Length == 0) < throw new ArgumentException("Cannot find minimum and maximum of null or empty array.");var min = int.MaxValue; // Initialize max to MinValue з кожним значенням у вкладці // є більшим, ніж цей початковий рівень. var max = int.MinValue; foreach (var i in input) < if (i < min) < min = i; >if (i > max) < max = i; >> return (min, max); >

Як показано в попередньому прикладі, з екземпляром кортежу, що повертається, можна працювати безпосередньо або деконструювати його в окремі змінні.

Типи кортежів можна використовувати замість анонімних типів, наприклад у запитах LINQ. Для отримання додаткових відомостей див. розділ Вибір між анонімними типами та кортежами.

Як правило, кортежі використовуються для групування слабо пов'язаних елементів даних. У загальнодоступних API рекомендується визначити клас чи тип структури.

Імена полів кортежів

Ви явно вказуєте імена полів кортежів у вираженні ініціалізації кортежу або у визначенні типу кортежу, як показано в наступному прикладі:

var t = (Sum: 4.5, Count: 3); Console.WriteLine($"Sum of elements is ."); (Double Sum, int Count) d = (4.5, 3); Console.WriteLine($"Sum of elements is .");

Якщо ім'я поля не вказано, воно може бути виведене з імені відповідної змінної у виразі ініціалізації кортежу, як показано в наступному прикладі:

var sum = 4.5; var count = 3; var t = (sum, count); Console.WriteLine($"Sum of elements is .");

Це називається ініціалізаторами проекції кортежів. Ім'я змінної не проектується на ім'я поля кортежу у таких випадках:

  • Ім'я кандидата - це ім'я елемента типу кортежу, наприклад Item3, ToString або Rest.
  • Ім'я кандидата є дублікатом іншого імені поля кортежу, явного чи неявного.

У попередніх випадках можна явно вказати ім'я поля або отримати доступ до стандартного поля.

За замовчуванням поля кортежу мають імена Item1 , Item2 , Item3 і т. д. Завжди можна використовувати ім'я поля за замовчуванням, навіть якщо ім'я поля вказано явно або виводиться, як показано в наступному прикладі.

var a = 1; var t = (a, b: 2, 3); Console.WriteLine($"The 1st element is (same as )."); Console.WriteLine($"The 2nd element is (same as )."); Console.WriteLine($"The 3rd element is ."); // Output: // The 1st element is 1 (same as 1). // The 2nd element is 2 (same as 2). // The 3rd element is 3.

Під час компіляції компілятор замінює імена полів за промовчанням відповідними іменами за промовчанням. В результаті явно вказані чи виведені імена полів будуть недоступні під час виконання.

Увімкніть правило стилю коду .NET IDE0037 , щоб задати перевагу виведеним або явним іменам полів кортежів.

Починаючи з C# 12, можна вказати псевдонім типу кортежу з директивою using . У наступному прикладі додається global using псевдонім для типу кортежу з двома цілими значеннями допустимого Min і Max значення:

Global using BandPass = (int Min, int Max);

Після оголошення псевдоніма можна використовувати BandPass ім'я як псевдонім для цього типу кортежу:

BandPass bracket = (40, 100); Console.WriteLine($"The bandpass filter is to ");

Псевдонім не запроваджує новий типале створює синонім тільки для існуючого типу. Ви можете деконструювати кортеж, оголошений псевдонімом BandPass так само, як і з його базовим типом кортежу:

(int a, int b) = bracket; Console.WriteLine($"The bracket is to ");

Як і при призначенні кортежу або деконструкції, імена елементів кортежу не повинні відповідати; Типи виконуються.

Аналогічним чином можна використовувати другий псевдонім з однаковими типами arity та членів взаємозамінно з вихідним псевдонімом. Можна оголосити другий псевдонім:

using Range = (int Minimum, int Maximum);

Кортеж можна призначити Range BandPass кортежу. Як і у всіх призначеннях кортежів, імена полів не повинні збігатися, тільки типи та арити.

Range r = bracket; Console.WriteLine($"The range is to ");

Псевдонім типу кортежу надає більш семантичні відомості під час використання кортежів. Він не запроваджує новий тип.Щоб забезпечити безпеку типів, натомість слід оголосити позиційний record елемент.

Присвоєння та деконструкція кортежів

C# підтримується привласнення між типами кортежів, які відповідають обом наступним умовам:

  • обидва типи кортежів повинні містити однакову кількість елементів;
  • для кожної позиції кортежу тип правого елемента кортежу аналогічний типу відповідного лівого елемента кортежу або може бути неявно перетворений на цей тип.

Значення елементів кортежу надаються у порядку розташування елементів кортежу. Імена полів кортежу не враховуються і не надаються, як показано в наступному прикладі.

(int, double) t1 = (17, 3.14); (double First, double Second) t2 = (0.0, 1.0); t2 = t1; Console.WriteLine($": and "); // Output: // t2: 17 and 3.14 (double A, double B) t3 = (2.0, 3.0); t3 = t2; Console.WriteLine($": and "); // Output: // t3: 17 and 3.14

Оператор присвоєння = можна також використовувати для деконструкції екземпляра кортежу в окремі змінні. Це можна зробити різними способами:

    Ви можете використовувати ключове слово var за межами круглих дужок, щоб оголосити типово змінені змінні і дозволити компілятору вивести їх типи.

var t = ("post office", 3.6); var (destination, distance) = t; Console.WriteLine($"Distance to is kilometers."); // Output: // Distance to post office is 3.6 kilometers.
var t = ("post office", 3.6); (string destination, double distance) = t; Console.WriteLine($"Distance to is kilometers."); // Output: // Distance to post office is 3.6 kilometers.
var t = ("post office", 3.6); (var destination, double distance) = t; Console.WriteLine($"Distance to is kilometers."); // Output: // Distance to post office is 3.6 kilometers.
var destination = string.Empty; var distance = 0.0; var t = ("post office", 3.6); (Destination, distance) = t; Console.WriteLine($"Distance to is kilometers."); // Output: // Distance to post office is 3.6 kilometers.

Призначення деконструкційного виразу може включати як існуючі змінні, і змінні, оголошені в оголошенні деконструкції.

Ви також можете поєднати деконструкцію зі зіставленням шаблонів, щоб перевірити характеристики полів у кортежі. У наступному прикладі виконується цикл за кількома цілими числами і виводиться число, яке ділиться на 3. Він деконструює результат Int32.DivRem кортежу і відповідає Remainder 0:

Докладніше про деконструкцію кортежів та інших типів див. у статті Деконструкція кортежів та інших типів.

Рівність кортежів

Типи кортежів == підтримують оператори та != оператори. Ці оператори порівнюють елементи лівого операнда з відповідними елементами правого операнда відповідно до порядку розташування елементів кортежу.

(int a, byte b) left = (5, 10); (long a, int b) right = (5, 10); Console.WriteLine(left == right); // output: True Console.WriteLine(left! = right); // output: False var t1 = (A: 5, B: 10); var t2 = (B: 5, A: 10); Console.WriteLine(t1 == t2); // output: True Console.WriteLine(t1! = t2); // output: False

Як показано в попередньому прикладі, в операціях == та != не враховуються імена полів кортежів.

Два кортежі можна порівняти, якщо виконані обидва наступні умови:

  • обидва кортежі містять однакову кількість елементів. Наприклад, t1 != t2 не компілюється, якщо t1 та t2 мають різну кількість елементів.
  • Для кожної позиції кортежу відповідні елементи з лівого та правого операнда кортежу порівнюються за допомогою операторів == і != . Наприклад, не компілюється, (1, (2, 3)) == ((1, 2), 3) оскільки 1 не порівнюється з (1, 2).

Оператори == і != Порівнюють кортежі зі скороченою обробкою. Це означає, що операція зупиняється, як вона відповідає парі нерівних елементів або досягає кінця кортежів. Однак перед будь-яким порівнянням все елементи кортежу обчислюються, як показано в прикладі.

Console.WriteLine((Display(1), Display(2)) == (Display(3), Display(4))); int Display(int s) < Console.WriteLine(s); return s; >// Output: // 1 // 2 // 3 // 4 // False

Кортежі як параметри виводу

Як правило, ви виконуєте рефакторинг методу, що має параметри out, метод, що повертає кортеж. Однак трапляються випадки, коли параметр out може мати тип кортежу. У наступному прикладі показано, як працювати з кортежами як параметрів out .

var limitsLookup = new Dictionary() < [2] = (4, 10), [4] = (10, 20), [6] = (0, 23) >; if (limitsLookup.TryGetValue(4, out (int Min, int Max) limits)) < Console.WriteLine($"Found limits: min is , max is "); > // Output: // Found limits: min is 10, max is 20

Кортежі та System.Tuple

Кортежі C# з типами System.ValueTuple, від кортежів, представлених типами System.Tuple. Основні відмінності полягають у наступному.

  • Типи System.ValueTuple є типами значень. Типи System.Tuple є типами посилань.
  • Типи System.ValueTuple змінюються. Типи System.Tuple є незмінними.
  • Елементами даних типів System.ValueTuple є поля. Елементами даних типів System.Tuple є характеристики.

Специфікація мови C#

Для отримання додаткових відомостей див.

також

Джерело цього вмісту можна знайти на GitHub, де також можна створювати та переглядати проблеми та запити на витягування. Для отримання додаткових відомостей див. посібник для учасників.

Схожі статті

  • Що таке таблиця об'єкт об'єкт
  • Що таке Кастер у підвісці
  • Що таке соус Шою
  • Що таке МСФЗ простими словами
  • Що таке сорт м'яса
  • Що таке Фасадна панель для посудомийної машини
  • Що таке джунглі історія 5 клас
  • Що таке обсяг простими словами
  • Недавні статті

  • Чому взуття скрипить при ходьбі
  • Коли день народження у стрічці
  • Чи можна кішці їсти сіль
  • Варіанти планування ділянки 15 соток прямокутної форми
  • Що означає півмісяця знак
  • Рейсмусовий верстат для чого
  • У якому віці парують свиней
  • У чому полягає принцип нарахування та у яких випадках він застосовується