乐趣区

关于.net:如何使用-C-中的-Tuple

开局一张图,首先申明的是 Tuple 不是什么陈腐概念,在编程语言 F#,Python 中早就有这个了,Tuple 是一种 有序的,无限不可变的,反对混淆类型的固定个数的 一种数据结构,有些敌人可能就想问了,这里的 混淆 是什么意思?其实就是说 Tuple 中的若干元素类型,即能够是同类型,也能够是不同类型。

值得注意的是,Tuple 中的元素是 只读的,而且其元素的程序也是在 Tuple 创立的时候指定好的,不能对其中的元素进行后续批改 也不能批改 Tuple 的大小。

为什么要应用 Tuple

上面列举了几种应用 Tuple 的场景:

  • 如果你的办法须要返回多个值 或者 办法须要传递多个值。
  • 如果你不想为某些性能专门去定义一个类。
  • 如果你有若干个混淆元素,并且想提供对其简略的拜访形式。

下面三种状况都是 Tuple 最善于的利用场景,值得用 Tuple 去解决。

有些敌人可能会想到 匿名类,但认真想想,匿名类 也有其缺点,比如说办法的返回值是不可能指定为匿名类型的,对吧。

当然 Tuple 也是有缺点的,列举如下:

  • 当你拜访 Tuple 中的元素时,你会发现只能应用 Item1, Item2, Item3 这样的模式,很显然这种太不易读了,而且一旦 Tuple 中的元素过多,保护起来也是一种累赘。
  • Tuple 是援用类型不是值类型,意味着它会在 托管堆 上进行内存调配,如果 Tuple 过大并且没有很好的开释,对程序也是一个不小的性能挑战。

C# 中应用 Tuple

叨叨叨的说了这么多,接下来看看如何应用,在 C# 中提供了一个 Tuple 类,这个类下有一个静态方法 Create 可用来生成 Tuple 实例,顺便提一下,这个 Create 办法提供了 8 个重载办法,上面展现了这些办法签名清单。


public static class Tuple
{public static Tuple<T1> Create<T1>(T1 item1)
    {return new Tuple<T1>(item1);
    }

    public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)
    {return new Tuple<T1, T2>(item1, item2);
    }

    public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)
    {return new Tuple<T1, T2, T3>(item1, item2, item3);
    }

    public static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4)
    {return new Tuple<T1, T2, T3, T4>(item1, item2, item3, item4);
    }

    public static Tuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
    {return new Tuple<T1, T2, T3, T4, T5>(item1, item2, item3, item4, item5);
    }

    public static Tuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
    {return new Tuple<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, item6);
    }

    public static Tuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
    {return new Tuple<T1, T2, T3, T4, T5, T6, T7>(item1, item2, item3, item4, item5, item6, item7);
    }

    public static Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>> Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)
    {return new Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>(item1, item2, item3, item4, item5, item6, item7, new Tuple<T8>(item8));
    }
}

接下来看看如何创立和初始化 Tuple。

            var listEmployee = new List<Tuple<int, string, string>>
            {Tuple.Create(1, "Joydip Kanjilal", "INDIA"),
              Tuple.Create(2, "Michael Stevens", "USA"),
              Tuple.Create(3, "Steve Barnes", "USA")
            };

一旦你的 Tuple 创立并初始化好,你能够像迭代其余汇合一样迭代 Tuple,上面的代码清单展现了如何去实现。


            foreach (Tuple<int, string, string> tuple in listEmployee)
            {Console.WriteLine(tuple.Item2);
            }

上面是残缺的代码清单展现了如何去 创立,初始化,迭代。


        static void Main(string[] args)
        {
            var listEmployee = new List<Tuple<int, string, string>>
            {Tuple.Create(1, "Joydip Kanjilal", "INDIA"),
                Tuple.Create(2, "Michael Stevens", "USA"),
                Tuple.Create(3, "Steve Barnes", "USA")
            };

            foreach (Tuple<int, string, string> tuple in listEmployee)
            {Console.WriteLine(tuple.Item2);
            }
            Console.Read();}

你也能够创立 嵌套的 Tuple,如下代码所示:


        static void Main(string[] args)
        {var tuple = Tuple.Create(1, "Joydip Kanjilal", new Tuple<string, string>("Hyderabad", "India"));
        }

译文链接:https://www.infoworld.com/art…

退出移动版