将数组转换为元组?

时间:2017-06-06 09:34:33

标签: c# arrays tuples

是否可以在C#中将数组转换为元组?像这样:

var ar = new int[2] {5, 7};
Tuple<int,int> t = Tuple.Create(ar);

6 个答案:

答案 0 :(得分:6)

不,System.Tuple有充分理由的最大尺寸。对于你似乎正在做的工作来说,这只是一个错误的工具。为什么不直接返回数组而不是元组?你的方法可能最终需要一个包含许多元素的元组,这些元素是荒谬的,并且根本无法维护。

更好而不是返回数组,返回ICollection<T>IEnumerable<T>等界面。

答案 1 :(得分:1)

通过执行此操作,您可以获得元组列表,但我没有看到这样做的原因:

      var ar = new int[2] { 5, 7 };

        List<Tuple<int>> result = ar
            .Select(x => Tuple.Create(x))
            .ToList();

或者如果你想把它放在一个元组中:

   var ar = new int[2] { 5, 7 };
    Tuple<int[]> result = Tuple.Create(ar);

如果您知道尺寸,请执行以下操作:

  Tuple<int, int> tuple = Tuple.Create(ar[0], ar[1]);

答案 2 :(得分:1)

现在使用 C# 7.0,您可以创建扩展方法来将数组解构为 ValueTuple,这使得

var (p1,p2,p3) = s.Split(':');

可能。

public static class ArrayExt {
    public static void Deconstruct<T>(this T[] srcArray, out T a0) {
        if (srcArray == null || srcArray.Length < 1)
            throw new ArgumentException(nameof(srcArray));

        a0 = srcArray[0];
    }

    public static void Deconstruct<T>(this T[] srcArray, out T a0, out T a1) {
        if (srcArray == null || srcArray.Length < 2)
            throw new ArgumentException(nameof(srcArray));

        a0 = srcArray[0];
        a1 = srcArray[1];
    }

    public static void Deconstruct<T>(this T[] srcArray, out T a0, out T a1, out T a2) {
        if (srcArray == null || srcArray.Length < 1)
            throw new ArgumentException(nameof(srcArray));

        a0 = srcArray[0];
        a1 = srcArray[1];
        a2 = srcArray[2];
    }

    public static void Deconstruct<T>(this T[] srcArray, out T a0, out T a1, out T a2, out T a3) {
        if (srcArray == null || srcArray.Length < 1)
            throw new ArgumentException(nameof(srcArray));

        a0 = srcArray[0];
        a1 = srcArray[1];
        a2 = srcArray[2];
        a3 = srcArray[3];
    }

    public static void Deconstruct<T>(this T[] srcArray, out T a0, out T a1, out T a2, out T a3, out T a4) {
        if (srcArray == null || srcArray.Length < 1)
            throw new ArgumentException(nameof(srcArray));

        a0 = srcArray[0];
        a1 = srcArray[1];
        a2 = srcArray[2];
        a3 = srcArray[3];
        a4 = srcArray[4];
    }

    public static void Deconstruct<T>(this T[] srcArray, out T a0, out T a1, out T a2, out T a3, out T a4, out T a5) {
        if (srcArray == null || srcArray.Length < 1)
            throw new ArgumentException(nameof(srcArray));

        a0 = srcArray[0];
        a1 = srcArray[1];
        a2 = srcArray[2];
        a3 = srcArray[3];
        a4 = srcArray[4];
        a5 = srcArray[5];
    }

    public static void Deconstruct<T>(this T[] srcArray, out T a0, out T a1, out T a2, out T a3, out T a4, out T a5, out T a6) {
        if (srcArray == null || srcArray.Length < 1)
            throw new ArgumentException(nameof(srcArray));

        a0 = srcArray[0];
        a1 = srcArray[1];
        a2 = srcArray[2];
        a3 = srcArray[3];
        a4 = srcArray[4];
        a5 = srcArray[5];
        a6 = srcArray[6];
    }

    public static void Deconstruct<T>(this T[] srcArray, out T a0, out T a1, out T a2, out T a3, out T a4, out T a5, out T a6, out T a7) {
        if (srcArray == null || srcArray.Length < 1)
            throw new ArgumentException(nameof(srcArray));

        a0 = srcArray[0];
        a1 = srcArray[1];
        a2 = srcArray[2];
        a3 = srcArray[3];
        a4 = srcArray[4];
        a5 = srcArray[5];
        a6 = srcArray[6];
        a7 = srcArray[7];
    }
}

答案 3 :(得分:0)

你的想法是一个坏主意......数组和元组不要混合&#34;在C#/。NET 。有些语言的数组和类之间的距离很小(比如Javascript,[...]运算符可以使用数组和对象)。 C#不是其中一种语言。 Tuple并未定义this[int n]索引器。

但是你要求代码,所以我会给你代码。

这里的主要问题是在编译时必须知道数组的大小(以及Tuple<>的大小):在您编写的代码中,您明确地编写了Tuple<int, int>。您可以轻松创建一个方法,给定两个(或更多)元素的数组,返回Tuple<T, T>,如:

public static Tuple<T, T> CreateTuple2<T>(T[] array)
{
    if (array == null || array.Length < 2)
    {
        throw new ArgumentException(nameof(array));
    }

    return Tuple.Create(array[0], array[1]);
}

通过此,您可以创建其他CreateTuple3()CreateTuple4() ...

答案 4 :(得分:0)

好吧,为什么我们不这样做呢

public static Tuple<T, T> CreateTuple<T>(T[] array, int totalItem = 2)
{
    if (arr.length % totalItem != 0)
    throw new Exception("Error the length dose not consist with totalItem");

    return Tuple.Create(arr);
}

这里我们验证每个项目都有一个和两个。

答案 5 :(得分:-1)

你可以使用子元组,例如这个

var tupArray = new Tuple<dynamic,dynamic,dynamic,dynamic,dynamic,dynamic,dynamic,Tuple<dynamic,dynamic>>
(
    a[0],a[1],a[2],a[3],a[4],a[5],a[6],new Tuple<dynamic,dynamic>(a[7],a[8])
)