将数组转换为元组?

问题描述 投票:0回答:6

C# 中可以将数组转换为元组吗?像这样的东西:

var ar = new int[2] {5, 7};
Tuple<int,int> t = Tuple.Create(ar);
c# arrays tuples
6个回答
11
投票

现在使用 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 < 3)
            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 < 4)
            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 < 5)
            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 < 6)
            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 < 7)
            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 < 8)
            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];
    }
}

5
投票

不,

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

更好的是,不要返回数组,而是返回一个接口,例如

ICollection<T>
IEnumerable<T>


-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]);

-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])
)

-1
投票

我们为什么不这样做呢

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

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


-3
投票

你的想法是个坏主意......数组和元组在 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()
...

© www.soinside.com 2019 - 2024. All rights reserved.