Будущая версия.NET будет поддерживать кортежи в C#?

69
задан Pratik 4 January 2012 в 10:43
поделиться

11 ответов

Я только что прочитал эту статью из журнала MSDN: Сборка кортежа

Вот выдержки:

Предстоящий выпуск Microsoft 4.0. .NET Framework представляет новый тип называется System.Tuple. System.Tuple - это коллекция фиксированного размера разнотипные данные.

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

Уже есть один пример кортеж, плавающий вокруг Microsoft .NET Framework в System.Collections.Generic пространство имен: KeyValuePair. Хотя KeyValuePair можно рассматривать как то же самое как кортеж, поскольку они оба типы, которые содержат две вещи, KeyValuePair отличается от Кортеж, потому что он вызывает отношения между двумя значениями, которые он хранит (и по уважительной причине, поскольку он поддерживает Класс словаря).

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


Хотя некоторые языки, такие как F #, имеют специальный синтаксис для кортежей, вы можете использовать новый общий тип кортежа из любого языка. Возвращаясь к первому примеру, мы видим, что хотя и полезны, кортежи могут быть чрезмерно подробными на языках без синтаксиса для кортежа:

class Program {
    static void Main(string[] args) {
        Tuple<string, int> t = new Tuple<string, int>("Hello", 4);
        PrintStringAndInt(t.Item1, t.Item2);
    }
    static void PrintStringAndInt(string s, int i) {
        Console.WriteLine("{0} {1}", s, i);
    }
}

Используя ключевое слово var из C # 3.0, мы можем удалить сигнатуру типа в переменной кортежа, что позволяет несколько более читаемый код.

var t = new Tuple<string, int>("Hello", 4);

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

var t = Tuple.Create("Hello", 4);
73
ответ дан 24 November 2019 в 13:39
поделиться
#region tuples

    public class Tuple<T>
    {
        public Tuple(T first)
        {
            First = first;
        }

        public T First { get; set; }
    }

    public class Tuple<T, T2> : Tuple<T>
    {
        public Tuple(T first, T2 second)
            : base(first)
        {
            Second = second;
        }

        public T2 Second { get; set; }
    }

    public class Tuple<T, T2, T3> : Tuple<T, T2>
    {
        public Tuple(T first, T2 second, T3 third)
            : base(first, second)
        {
            Third = third;
        }

        public T3 Third { get; set; }
    }

    public class Tuple<T, T2, T3, T4> : Tuple<T, T2, T3>
    {
        public Tuple(T first, T2 second, T3 third, T4 fourth)
            : base(first, second, third)
        {
            Fourth = fourth;
        }

        public T4 Fourth { get; set; }
    }

    #endregion

И сделать объявления более симпатичными:

public static class Tuple
{
    //Allows Tuple.New(1, "2") instead of new Tuple<int, string>(1, "2")
    public static Tuple<T1, T2> New<T1, T2>(T1 t1, T2 t2)
    {
        return new Tuple<T1, T2>(t1, t2);
    }
    //etc...
}
69
ответ дан Benjol 24 November 2019 в 13:39
поделиться

Существует надлежащие (не быстрый) Кортеж C# реализация в Lokad Общие Библиотеки (Открытый исходный код, конечно), который включает следующие необходимые функции:

  • 2-5 неизменных реализаций кортежа
  • Надлежащий DebuggerDisplayAttribute
  • Надлежащее хеширование и проверки равенства
  • Помощники для генерации кортежей от обеспеченных параметров (дженерики выведены компилятором), и расширения для основанных на наборе операций.
  • протестированный на производство.
15
ответ дан Rinat Abdullin 24 November 2019 в 13:39
поделиться

Реализация классов Кортежа или многократное использование, классы F# в C# являются только половиной истории - они дают Вам способность создать кортежи с относительной простотой, но не действительно синтаксический сахар, который делает их настолько хорошими использовать на языках как F#.

, Например, в F# можно использовать сопоставление с образцом для извлечения обеих частей кортежа в statment, которому позволяют, например,

let (a, b) = someTupleFunc

, К сожалению, чтобы сделать, то же использование классов F# от C# было бы намного менее изящным:

Tuple<int,int> x = someTupleFunc();
int a = x.get_Item1();
int b = x.get_Item2();

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

14
ответ дан Chris Ballard 24 November 2019 в 13:39
поделиться

По-моему, анонимной функцией типов не является кортеж, а очень похожая конструкция. Вывод некоторых Запросов LINQ является наборами анонимных типов, которые ведут себя как кортежи.

Вот оператор, который создает введенный кортеж:-), на лету:

var p1 = new {a = "A", b = 3};

см.: http://www.developer.com/net/csharp/article.php/3589916

12
ответ дан Andreas Grech 24 November 2019 в 13:39
поделиться

C# поддерживает простые кортежи через дженерики довольно легко (согласно более раннему ответу), и с "вводом бормотания" (одно из многих возможных улучшений языка C#) для улучшения вывода типа, они могли быть очень, очень мощны.

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

Для кода в отдельном методе, существуют анонимные типы; для выхода наружу кода метода я думаю, что буду придерживаться простых именованных типов. Конечно, если будущий C# облегчит делать их неизменными (в то время как все еще легкий для работы с), то я буду счастлив.

3
ответ дан Matt Davis 24 November 2019 в 13:39
поделиться

Вот мой набор кортежей, они автоматически генерируются сценарием Python, таким образом, я, возможно, пошел немного за борт:

Ссылка на репозиторий Подрывной деятельности

Вам будет нужно имя пользователя/пароль, они оба гость

, Они основаны на наследовании, но Tuple<Int32,String> не выдержит сравнение равный Tuple<Int32,String,Boolean>, даже если у них, окажется, будут те же значения для двух первых участников.

Они также реализуют GetHashCode и ToString и т.д и много небольших вспомогательных методов.

Пример использования:

Tuple<Int32, String> t1 = new Tuple<Int32, String>(10, "a");
Tuple<Int32, String, Boolean> t2 = new Tuple<Int32, String, Boolean>(10, "a", true);
if (t1.Equals(t2))
    Console.Out.WriteLine(t1 + " == " + t2);
else
    Console.Out.WriteLine(t1 + " != " + t2);

произведет:

10, a != 10, a, True
2
ответ дан angry person 24 November 2019 в 13:39
поделиться

Если я помню свои занятия по Информатике правильно, кортежи являются просто данными.

, Если Вы хотите сгруппированные данные - создают классы, которые содержат свойства. При необходимости в чем-то как KeyValuePair тогда там, это.

1
ответ дан Tigraine 24 November 2019 в 13:39
поделиться

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

, Если Вы хотите два значения в одном экземпляре, KeyValuePair<> достойная замена, хотя неуклюжий. Можно также сделать структуру или класс, это сделает то же самое и расширяемо.

0
ответ дан Merus 24 November 2019 в 13:39
поделиться

Для создания их полезными в хеш-таблице или словаре Вы, вероятно, захотите предоставить перегрузки GetHashCode и Равняетесь.

0
ответ дан 24 November 2019 в 13:39
поделиться

My open source .NET Sasa library has had tuples for years (along with plenty of other functionality, like full MIME parsing). I've been using it in production code for a good few years now.

3
ответ дан 24 November 2019 в 13:39
поделиться
Другие вопросы по тегам:

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