Есть ли какие-нибудь практические примеры кортежей для начинающих программистов?

Я делаю обучающее видео по C # 4.0 для начинающих программистов .

Для каждой темы, которую я представляю, я включаю практический пример , который студент может фактически использовать, например, для улучшенной функциональности COM-взаимодействия , я показываю, как создать файл Excel и заполните его значениями из кода.

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

Я также хотел бы представить кортежи , если можно, но кажется, что все «практические примеры» (как в этом вопросе: Практический пример, в котором можно использовать Tuple. Net 4.0? ) очень продвинуты. Учащиеся, которые используют видео, изучают ООП, LINQ, использование универсальных шаблонов и т. Д., Но, например, функциональное программирование или «решение проблемы 11 Project Euler» выходит за рамки этого видео.

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

Вот что у меня есть, но это просто сухая механика без какой-либо функциональности:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //two ways to define them
            var customer = new Tuple<int, string, string>(23, "Sam", "Smith");
            var customer2 = Tuple.Create<int, string, string>(34, "James", "Allard");

            //with type inference, more concise (only available with the Create keyword)
            var customer3 = Tuple.Create(23, "John", "Hoopes");

            //you can go up to eight, then you have to send in another tuple
            var customer4 = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9, 10));

            Console.WriteLine(customer.Item1);
            Console.WriteLine(customer2.Item2);
            Console.WriteLine(customer3.Item3);
            Console.WriteLine(customer4.Rest.Item1.Item3);

            Console.ReadLine();
        }
    }
}
15
задан Community 23 May 2017 в 12:19
поделиться

4 ответа

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

На ум приходит возвращение значения (которое на самом деле может быть нулевым) из функции, выполняющей поиск (или вычисление), вместе с логическим значением, которое указывает, был ли результат найден или нет. Это подход, который позволяет избежать использования параметров out, которые могут быть громоздкими или проблематичными в определенных сценариях (например, запросы LINQ):

public Tuple<string,bool> SearchDictionary( string searchKey )
{
    string value;
    bool wasFound = someDictionary.TryGetValue( searchKey, out value );
    return new Tuple<string,bool( value, wasFound );
}

// since <null> is a legal value to store in the dictionary, we cannot
// use it to distinguish between 'value not found' and 'value is null'.
// the Tuple<string,bool>, however, does allow us to do so...
var result = SearchDictionary( "somekey" );
if( result.Item2 )
{
    Console.WriteLine( result.Item1 );
}

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

// note the symmetry in the representation of opponents of a tennis match...
// if the relationship were asymmetrical, tuple may not be the best choice.
var playerA  = new TennisPlayer("Serena Williams");
var playerB  = new TennisPlayer("Venessa Williams");
var match    = new Tuple<TennisPlayer,TennisPlayer>( playerA, playerB );

Создание класса для чего-то вроде этого можно избежать, если вместо этого использовать кортежи.

Последний пример - использование кортежей для представления составных ключей в словаре. Поскольку Tuple <> s можно сравнивать друг с другом на предмет равенства, появляется возможность делать такие вещи, как:

var complexDictionary = 
      new Dictionary<Tuple<string,int,decimal,DateTime>,string>();
complexDictionary.Add( new Tuple("USA",-4,1.671,DateTime.Now), "active" );

EDIT: Один комментарий, который я хотел бы сделать при обучении разработчиков использованию кортежей, заключается в том, что кортежи должны редко (если вообще когда-либо) появляться в общедоступном интерфейсе кода, который вы ожидаете от других . Я думаю, что в качестве инструментов для упрощения внутренней реализации класса или модуля они подходят. Но как только вы начнете передавать их в методы или из них, с которыми должны взаимодействовать разработчики, использующие ваш код, вы столкнетесь с проблемой, заключающейся в том, что кортежи скрывают семантику вашего API. Разработчикам становится трудно понять, что должно означать Tuple .Что означают Item1 или Item2 в таком случае? Когда вы видите, что вам нужно передавать кортежи в методы или из них, вам следует серьезно подумать о написании класса для инкапсуляции и прояснения отношений.

13
ответ дан 1 December 2019 в 03:42
поделиться

Лучшая практическая причина, которую я вижу, - это использование их в качестве временных «классов». Вы хотите связать несколько частей информации, но не создавать еще одну структуру классов для их хранения.

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

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

5
ответ дан 1 December 2019 в 03:42
поделиться

Я использую их вместо частных уроков. Они хороши при использовании внутри в классе. Разоблачение их вне класса только приводило к путанице. Мне все время приходилось открывать класс, чтобы определить, что к чему.

2
ответ дан 1 December 2019 в 03:42
поделиться

А что насчет формы входа? Они видят это все время.

var loginCredentials = 
    new Tuple<string, SecureString>(nameTextBox.Text, passwordTextBox.Text);

if (Login(loginCredentials))
    Console.Writeline("Login - Success!");
else
    Console.Writeline("Login - Failure");

...

public bool Login(Tuple<string, SecureString> loginCredentials)
{
    return ...
}
0
ответ дан 1 December 2019 в 03:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: