将一对数组转换为一组数组对(如果可能使用LINQ)。

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(...开始,那么我不知道如何在Select语句中获取与Item2相同的条目(索引方式)。

2
您可以使用 Zip 完成此操作。 - MakePeaceGreatAgain
1
我通常会使用类似这样的代码:var arrayOfPairs = S.Select((x,i) => new object[] { s = x, t = T[i] }).ToArray(); - jdweng
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();

2
C#7元组的用途不错。 - MakePeaceGreatAgain

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

然而,这种方式无法使用匿名类型。


1
或者像这样:arrayOfPairs = pairOfArrays.Item1.Zip(pairOfArrays.Item2, (s, t) => (s, t)).ToArray(); - Kjara
@Kjara 如果你需要一个数组,那么是的。 - MakePeaceGreatAgain
@HimBromBeere 也许原帖的作者想要值元组,而不是匿名类。 - juharr
@juharr 没错,但我忽略了它,因为Aomine已经考虑过这个问题了。 - MakePeaceGreatAgain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接