将数组对转换为数组对(如果可能,使用 LINQ)
convert pair of arrays to array of pairs (using LINQ if possible)
我有一些类型 S
和 T
(例如 S=object
和 T=string
)。
我有一对这些类型的数组,即
(S[], T[]) pairOfArrays;
我想把它转换成一对数组,即
(S, T)[] arrayOfPairs;
我该怎么做?如果可能的话,我对 LINQ 的解决方案最感兴趣。
请假设pairOfArrays
中的两个数组长度相同。
我知道另一个方向:
pairOfArrays = (arrayOfPairs.Select(i => i.Item1).ToArray(),
arrayOfPairs.Select(i => i.Item2).ToArray());
我所寻求的方向的问题是:为了迭代(使用 Select
等)我需要一个 IEnumerable
,但是 (S[], T[])
不是 IEnumerable
.如果我从 pairOfArrays.Item1.Select(...
开始,那么我不知道如何到达 Item2
的相同条目(按索引),因为我目前在我的 Select
语句中。
您可以为此使用 Zip
:
var result = arrayOfS.Zip(arrayOfT, (first, second) => new { S = first, T = second });
这会生成 { S, T }
.
的列表
或者一个很好的老式循环:
for(int i = 0; i < arrayOfS.Length; i++)
{
result[i] = new ST(arrayOfS[i], arrayOfT[i]);
}
但是这样你就不能使用匿名类型了。
使用Zip
,可以得到对应的元素,转化为元组:
var arrayOfPairs = pairOfArrays.Item1.Zip(pairOfArrays.Item2, (f, s) => new Tuple<S, string>(f, s))
.ToArray();
或从 C#7 开始:
var arrayOfPairs = pairOfArrays.Item1.Zip(pairOfArrays.Item2, (f, s) => (f, s))
.ToArray();
一种不像上面那样惯用的方法,但仍然是一个好的解决方案是使用 Enumerable.Range
:
var arrayOfPairs =
Enumerable.Range(0, pairOfArrays.Item1.Length)
.Select(index => (pairOfArrays.Item1[index], pairOfArrays.Item2[index]))
.ToArray();
我有一些类型 S
和 T
(例如 S=object
和 T=string
)。
我有一对这些类型的数组,即
(S[], T[]) pairOfArrays;
我想把它转换成一对数组,即
(S, T)[] arrayOfPairs;
我该怎么做?如果可能的话,我对 LINQ 的解决方案最感兴趣。
请假设pairOfArrays
中的两个数组长度相同。
我知道另一个方向:
pairOfArrays = (arrayOfPairs.Select(i => i.Item1).ToArray(),
arrayOfPairs.Select(i => i.Item2).ToArray());
我所寻求的方向的问题是:为了迭代(使用 Select
等)我需要一个 IEnumerable
,但是 (S[], T[])
不是 IEnumerable
.如果我从 pairOfArrays.Item1.Select(...
开始,那么我不知道如何到达 Item2
的相同条目(按索引),因为我目前在我的 Select
语句中。
您可以为此使用 Zip
:
var result = arrayOfS.Zip(arrayOfT, (first, second) => new { S = first, T = second });
这会生成 { S, T }
.
或者一个很好的老式循环:
for(int i = 0; i < arrayOfS.Length; i++)
{
result[i] = new ST(arrayOfS[i], arrayOfT[i]);
}
但是这样你就不能使用匿名类型了。
使用Zip
,可以得到对应的元素,转化为元组:
var arrayOfPairs = pairOfArrays.Item1.Zip(pairOfArrays.Item2, (f, s) => new Tuple<S, string>(f, s))
.ToArray();
或从 C#7 开始:
var arrayOfPairs = pairOfArrays.Item1.Zip(pairOfArrays.Item2, (f, s) => (f, s))
.ToArray();
一种不像上面那样惯用的方法,但仍然是一个好的解决方案是使用 Enumerable.Range
:
var arrayOfPairs =
Enumerable.Range(0, pairOfArrays.Item1.Length)
.Select(index => (pairOfArrays.Item1[index], pairOfArrays.Item2[index]))
.ToArray();