Каким требованием был разработан кортеж, предназначенный для решения?

Я рассматриваю новую функцию С# для кортежей. Мне любопытно, какая проблема заключалась в том, что кортеж предназначен для решения?

Что вы использовали кортежи для своих приложений?

Обновление

Спасибо за ответы до сих пор, позвольте мне посмотреть, есть ли у меня все в голове. Хорошим примером кортежа было указано как координаты. Правильно ли это выглядит?

var coords = Tuple.Create(geoLat,geoLong);

Затем используйте кортеж следующим образом:

var myLatlng = new google.maps.LatLng("+ coords.Item1 + ", "+ coords.Item2 + ");

Правильно ли это?

Ответ 1

При написании программ чрезвычайно важно, чтобы логически группировать вместе набор значений, которые не имеют достаточной общности, чтобы оправдать создание класса.

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

void M(int foo, string bar, double blah)

Логически это точно так же, как метод M, который принимает один аргумент, который является 3-кортежем int, string, double. Но я надеюсь, что вы на самом деле не сделали:

class MArguments
{
   public int Foo { get; private set; } 
   ... etc

если у бизнес-логики не было другого значения.

Понятие "группировать вместе группу не связанных друг с другом данных в некоторой структуре, которая является более легкой, чем класс", полезна во многих местах, а не только для формальных списков параметров методов. Это полезно, когда у метода есть две вещи, которые нужно вернуть, или когда вы хотите закрепить словарь из двух данных, а не одного, и так далее.

Языки, такие как F #, которые поддерживают типы кортежей, изначально обеспечивают большую гибкость для своих пользователей; они представляют собой чрезвычайно полезный набор типов данных. Команда BCL решила работать с командой F #, чтобы стандартизировать один тип кортежа для структуры, чтобы каждый язык мог извлечь из этого выгоду.

Однако на данный момент нет поддержки языка для кортежей в С#. Кортежи - это еще один тип данных, как и любой другой класс framework; в них нет ничего особенного. Мы рассматриваем возможность добавления поддержки кортежей в гипотетических будущих версиях С#. Если у кого-нибудь есть мысли о том, какие функции связаны с кортежами, которые вы хотели бы увидеть, я был бы рад передать их вместе с командой дизайнеров. Реалистичные сценарии более убедительны, чем теоретические размышления.

Ответ 2

Кортежи предоставляют неизменную реализацию коллекции

Помимо обычного использования кортежей:

  • группировать общие значения вместе, не создавая класс
  • для возврата нескольких значений из функции/метода
  • и т.д...

Неизменяемые объекты по сути являются безопасными по потоку:

Непрерывные объекты могут быть полезны в многопоточных приложениях. Несколько потоков могут воздействовать на данные, представляемые неизменяемыми объектами, без учета данных, которые изменяются другими потоками. Поэтому неизменяемые объекты считаются более потокобезопасными, чем изменяемые объекты.

Из Неизменяемый объект в wikipedia

Ответ 3

Он предоставляет альтернативу ref или out, если у вас есть метод, который должен возвращать несколько новых объектов как часть его ответа.

Он также позволяет использовать встроенный тип в качестве возвращаемого типа, если все, что вам нужно сделать, это создать два или три существующих типа, и вам не нужно добавлять класс/структуру только для это сочетание. (Желательно, чтобы функция могла возвращать анонимный тип? Это частичный ответ на эту ситуацию.)

Ответ 4

Часто бывает полезно иметь тип "пары", просто используемый в быстрых ситуациях (например, возврат двух значений из метода). Кортежи являются центральной частью функциональных языков, таких как F #, и С# подняли их на этом пути.

Ответ 5

очень полезно для возврата двух значений из функции

Ответ 6

Лично я считаю, что Tuples является итеративной частью разработки, когда вы находитесь в следственном цикле или просто "играете". Поскольку Tuple является общим, я склонен думать об этом при работе с общими параметрами - особенно, когда вы хотите разработать общий фрагмент кода, и я начинаю с конца кода, а не спрашиваю себя: "Как мне понравится этот вызов? посмотреть?".

Довольно часто я понимаю, что сбор, который форматы Tuple становятся частью списка, и глядя на List > , действительно не выражает намерения списка или как он работает. Я часто "живу" с ним, но обнаруживаю, что хочу манипулировать списком и изменять значение - в этот момент я не обязательно хочу создавать для него новый Tuple, поэтому мне нужно создать собственный класс или структуру удерживать его, поэтому я могу добавить код манипуляции.

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

Были времена, когда мне хотелось выразить данные как кортеж, и не было доступных Tuples. (VS2008), в этом случае я только что создал свой собственный класс Tuple, и я не делаю его потокобезопасным (неизменным).

Итак, я думаю, что я считаю, что Tuples - ленивое программирование за счет потери имени типа, которое описывает его цель. Другой расход заключается в том, что вы должны объявить подпись Tuple, если бы она использовалась в качестве параметра. После нескольких методов, которые начинают выглядеть раздутыми, вы можете чувствовать себя так же, как и я, что стоит сделать класс, поскольку он очищает сигнатуры метода.

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

Итак, в ретроспективе, я считаю, что я использую Tuples, когда я не хочу уходить и писать класс, и просто хочу подумать о том, что я написал сейчас. Это означает, что подпись Tuple может сильно измениться в тексте за полчаса, пока я выясню, какие данные мне понадобятся для этого метода, и как он возвращает значения, которые когда-либо будут возвращены.

Если мне удастся реорганизовать код, я часто стану подвергать сомнению место Tuple в нем.

Ответ 7

A Tuple часто используется для возврата нескольких значений из функций, когда вы не хотите создавать определенный тип. Если вы знакомы с Python, у Python это было в течение длительного времени.

Ответ 8

Общим для использования может быть создание классов/структур, содержащих только 2 поля, вместо этого вы создаете Tuple (или KeyValuePair). Полезно в качестве возвращаемого значения, избегать передачи параметров N out...

Ответ 9

Возврат более одного значения из функции. getCoordinates() не очень полезен, если он просто возвращает x или y или z, но создание полного класса и объекта для хранения трех целых чисел также выглядит довольно тяжелым.

Ответ 10

Старый вопрос с 2010 года, а теперь в 2017 году Dotnet меняется и становится более умным.

С# 7 вводит поддержку языков для кортежей, что позволяет использовать семантические имена для полей кортежа, используя новые, более эффективные типы кортежей.

В сравнении с 2017 и .Net 4.7 (или устанавливая пакет nuget System.ValueTuple), вы можете создать/использовать кортеж очень эффективным и простым способом:

     var person = (Id:"123", Name:"john"); //create tuble with two items
     Console.WriteLine($"{person.Id} name:{person.Name}") //access its fields

Возврат более одного значения из метода:

    public (double sum, double average) ComputeSumAndAverage(List<double> list)
    {
       var sum= list.Sum();
        var average = sum/list.Count;
        return (sum, average);
    }

    How to use:

        var list=new List<double>{1,2,3};
        var result = ComputeSumAndAverage(list);
        Console.WriteLine($"Sum={result.sum} Average={result.average}");    

Подробнее читайте: https://docs.microsoft.com/en-us/dotnet/csharp/tuples

Ответ 11

Я нахожу, что KeyValuePair обновляется на С#, чтобы перебирать пары значений ключа в словаре.

Ответ 12

Я наткнулся на этот контрольный тест между наборами Tuples и Key-Value, и, вероятно, tou найдет это интересным. В целом, это говорит о том, что Tuple имеет преимущество, потому что это calss, поэтому он хранится в куче, а не в стеке, и когда передается как аргумент, его указатель - единственное, что происходит. Но KeyValuePair - это структуры, поэтому он быстрее выделяется, но при использовании он медленнее.

http://www.dotnetperls.com/tuple-keyvaluepair

Ответ 13

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