在C#中添加数组但不复制重复值

3
什么是最快的方法来完成这个任务:
var firstArray = Enumerable.Range(1, 10).ToArray(); // 1,2,3,4,5,6,7,8,9,10
var secondArray = Enumerable.Range(9, 3).ToArray(); //                 9,10,11,12
var thirdArray = Enumerable.Range(2, 3).ToArray();  //   2,3,4,5
//add these arrays expected output would be            1,2,3,4,5,6,7,8,9,10,11,12

有没有使用linq的方法来完成这个?我有一个巨大的数组列表要迭代。另一个例子。
var firstArray = Enumerable.Range(1, 10).ToArray(); // 1,2,3,4,5,6,7,8,9,10
var secondArray = Enumerable.Range(12, 1).ToArray(); //                     12,13
//add these arrays expected output would be            1,2,3,4,5,6,7,8,9,10,12,13

注意:我更喜欢一个适用于日期范围的函数。


类似的问题在这里:https://dev59.com/fk_Sa4cB1Zd3GeqP_U1h - Ben Voigt
1个回答

8
.Union会给你不同序列的组合。注意:如果你正在使用自定义类型,你需要在类内提供GetHashCode/Equals的重载方法或者在重载中提供一个IEqualityComparer<T>来为你的类型进行比较。对于像intDateTime这样的BCL类型,你是不需要担心的。

示例:

var sequence = Enumerable.Range(0,10).Union(Enumerable.Range(5,10));
// should result in sequence of 0 through 14, no repeats

编辑

有没有一种优雅的方式可以将我所有的范围合并,而不是将它们都链接在一个命令中。

如果你有一个序列的序列,可以是一个列表集合,也可能是一个交错数组,你可以使用SelectMany方法以及Distinct

int[][] numberArrays = new int[3][];
numberArrays[0] = new int[] { 1, 2, 3, 4, 5 };
numberArrays[1] = new int[] { 3, 4, 5, 6, 7 };
numberArrays[2] = new int[] { 2, 4, 6, 8, 10 };

var allUniqueNumbers = numberArrays.SelectMany(i => i).Distinct();

否则,您可以考虑创建自己的扩展方法来处理这个问题。
public static class MyExtensions
{
    public static IEnumerable<T> UnionMany<T>(this IEnumerable<T> sequence, params IEnumerable<T>[] others)
    {
        return sequence.Union(others.SelectMany(i => i));
    }
}

//

var allUniques = numberArrays[0].UnionMany(numberArrays[1], numberArrays[2]);

有什么优雅的方法可以将所有范围合并而不需要在一个命令中链接它们? - Aivan Monceller
最后,一个List<int32[]>怎么样? - Aivan Monceller
@geocine,SelectMany方法仍然适用。int[]IEnumerable<T>的实现者,List<>也是一个实现者。与int[][]相同的LINQ代码适用于上述集合,并且也适用于IEnumerable<IEnumerable<int>> - Anthony Pegram

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