当前位置:  开发笔记 > 编程语言 > 正文

.NET的未来版本是否会支持C#中的元组?

如何解决《.NET的未来版本是否会支持C#中的元组?》经验,为你挑选了6个好方法。

.Net 3.5不支持元组.太糟糕了,但不确定.net的未来版本是否会支持元组?



1> Andreas Grec..:

我刚读过MSDN杂志上的这篇文章:Building Tuple

以下是摘录:

即将发布的Microsoft .NET Framework 4.0版本引入了一种名为System.Tuple的新类型.System.Tuple是异构类型数据的固定大小集合.    

 

像数组一样,元组具有固定大小,一旦创建就无法更改.与数组不同,元组中的每个元素可以是不同的类型,元组能够保证每个元素的强类型.

 

在System.Collections.Generic命名空间中,已经有一个围绕Microsoft .NET Framework浮动的元组示例:KeyValuePair.虽然KeyValuePair可以被认为与Tuple相同,因为它们都是包含两个东西的类型,KeyValuePair与Tuple不同,因为它唤起了它存储的两个值之间的关系(并且有充分的理由,因为它支持Dictionary类).

此外,元组可以任意调整大小,而KeyValuePair只包含两个东西:键和值.


虽然像F#这样的某些语言具有特殊的元组语法,但您可以使用任何语言的新公共元组类型.回顾第一个例子,我们可以看到,虽然有用,但元组在没有元组语法的语言中可能过于冗长:

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

使用C#3.0中的var关键字,我们可以删除元组变量上的类型签名,这允许更易读的代码.

var t = new Tuple("Hello", 4);

我们还为静态Tuple类添加了一些工厂方法,这使得使用支持类型推断的语言(如C#)更容易构建元组.

var t = Tuple.Create("Hello", 4);



2> dimarzionist..:
#region tuples

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

        public T First { get; set; }
    }

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

        public T2 Second { get; set; }
    }

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

        public T3 Third { get; set; }
    }

    public class Tuple : Tuple
    {
        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(1, "2")
    public static Tuple New(T1 t1, T2 t2)
    {
        return new Tuple(t1, t2);
    }
    //etc...
}


如果您不需要比较两个元组的相等性,那么这种继承方法就可以了.我想在我的实现中实现IEquatable >等等,所以我不能使用继承,因为我不希望Tuple 等于Tuple .
@Joel,你可以让Equals检查两个参数的动态类型.

3> Rinat Abdull..:

Lokad共享库(当然是开源的)中有一个适当的(不是快速的)C#Tuple实现,包括以下必需的功能:

2-5不可变元组实现

适当的DebuggerDisplayAttribute

适当的哈希和平等检查

帮助程序,用于从提供的参数生成元组(泛型由编译器推断)和基于集合的操作的扩展.

生产测试.



4> Chris Ballar..:

在C#中实现Tuple类或重用F#类只是故事的一半 - 这些使您能够相对轻松地创建元组,但实际上不是语法糖,这使得它们在F#等语言中的使用非常好.

例如,在F#中,您可以使用模式匹配来提取let语句中的元组的两个部分,例如

let (a, b) = someTupleFunc

不幸的是,使用C#中的F#类来做同样的事情会更不优雅:

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

元组表示一种强大的方法,用于从函数调用中返回多个值,而无需使用一次性类来丢弃代码,或者使用丑陋的ref或out参数.然而,在我看来,如果没有一些语法糖来使他们的创作和访问更加优雅,它们的用途有限.



5> ChaosSpeeder..:

在我看来,匿名类型功能不是一个元组,而是一个非常相似的结构.一些LINQ查询的输出是匿名类型的集合,其行为类似于元组.

这是一个声明,它会在运行中创建一个类型化的元组:-):

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

请参阅:http://www.developer.com/net/csharp/article.php/3589916



6> Tim Pohlmann..:

C#7原生支持元组:

var unnamedTuple = ("Peter", 29);
var namedTuple = (Name: "Peter", Age: 29);
(string Name, double Age) typedTuple = ("Peter", 29);

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有