代码之家  ›  专栏  ›  技术社区  ›  Chaddeus

元组设计用来解决什么需求?

  •  94
  • Chaddeus  · 技术社区  · 15 年前

    我正在研究元组的新特性。我很好奇,元组是用来解决什么问题的?

    你在应用程序中使用元组做什么?

    谢谢你迄今为止的回答,让我看看我的头脑是否清楚。 元组的一个很好的例子被指出是坐标。这看起来对吗?

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

    然后像这样使用元组:

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

    对吗?

    13 回复  |  直到 12 年前
        1
  •  116
  •   Eric Lippert    15 年前

    在编写程序时,非常常见的情况是希望逻辑地将一组没有足够公共性的值组合在一起,以证明创建一个类是合理的。

    许多编程语言允许您以逻辑方式将一组原本不相关的值组合在一起,而无需仅以一种方式创建类型:

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

    逻辑上,这与方法M完全相同,方法M只接受一个参数,即int、string和double的三元组。但我希望你不会真的做出:

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

    “在比类更轻量级的结构中将一堆不相关的数据组合在一起”的概念在很多地方都很有用,而不仅仅是在方法的形式参数列表中。当一个方法有两个要返回的内容时,或者当您想从两个数据而不是一个数据中为字典设置关键字时,这种方法非常有用,以此类推。

    像F#这样的支持元组类型的语言为用户提供了极大的灵活性;它们是一组非常有用的数据类型。BCL团队决定与F团队合作,对框架的一种元组类型进行标准化,以便每种语言都能从中受益。

    语言

        2
  •  22
  •   Evan Plaice    11 年前

    元组提供集合的不可变实现

    • 将公共值分组在一起而不必创建类
    • 等。。。

    不可变对象本质上是线程安全的:

    "Immutable Object"

        3
  •  12
  •   Toby    15 年前

    它提供了一种替代 ref out 如果有一个方法需要返回多个新对象作为其响应的一部分。

    它还允许您使用内置类型作为返回类型,如果您需要做的只是混搭两个或三个现有类型,并且您不希望仅为这种组合添加类/结构(是否希望函数可以返回匿名类型?这是对这种情况的部分回答。)

        4
  •  10
  •   Stephen Cleary    15 年前

        5
  •  5
  •   Keith Nicholas    15 年前

    对于从函数返回两个值非常有用

        6
  •  4
  •   Simon Miller    11 年前

    就我个人而言,我发现元组是开发的一个迭代部分,当你处于一个调查周期,或者只是“玩”的时候。因为元组是泛型的,所以在使用泛型参数时我倾向于考虑它—特别是在希望开发一段泛型代码时,我从代码末尾开始,而不是问自己“我希望这个调用看起来怎么样?”。

    当然,总是有扩展方法的——但通常你不想把多余的代码扩展到泛型实现。

    有时我想把数据表示成一个元组,但却没有元组可用(VS2008)在这种情况下,我刚刚创建了自己的元组类-我没有使它成为线程安全的(不可变的)。

    我倾向于首先让这个班成为你已经在工作的那个班的一个公共成员。但当它扩展到仅仅是一个值集合之外时,它就得到了它自己的文件,我将它从包含类中移出。

    所以现在回想起来,我相信我用元组的时候,我不想去写一个类,只想想想我现在写的东西。这意味着半个小时后,元组的签名可能会在文本中发生很大的变化,同时我要弄清楚这个方法需要什么数据,以及它如何返回它将返回的值。

    如果我有机会重构代码,那么我经常会质疑元组在其中的位置。

        7
  •  3
  •   M.Hassan    8 年前

    C#7引入了对元组的语言支持,它使用新的、更高效的元组类型为元组字段启用语义名称。

         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

        8
  •  1
  •   Randy Minder    15 年前

    当您不想创建特定类型时,元组通常用于从函数返回多个值。如果您熟悉Python的话,Python已经有很长一段时间了。

        9
  •  1
  •   Dean J    15 年前

        10
  •  1
  •   user347594    15 年前

    一个常见的用法可能是避免创建只包含2个字段的类/结构,而是创建一个元组(或者现在创建一个KeyValuePair)。 用作返回值,避免传递N个参数。。。

        11
  •  0
  •   Jubal    15 年前

        12
  •  0
  •   Aishvarya Jaiswal    11 年前

    它在从函数返回值时非常有用。我们可以有多个值回来,这是一个相当节省在某些情况下。