3

我有一些类型ST(例如S=objectT=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(...中的相同条目(按索引) 。Item2Select

4

2 回答 2

5

使用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();
于 2018-11-30T13:37:44.077 回答
3

您可以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]);
}

但是,这种方式你不能使用匿名类型。

于 2018-11-30T13:33:46.077 回答