是否可以在C#中将数组转换为元组?像这样:
var ar = new int[2] {5, 7};
Tuple<int,int> t = Tuple.Create(ar);
答案 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])
)