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

Aiv*_*ler 3 .net c# arrays union intersection

最快的方法是:

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
Run Code Online (Sandbox Code Playgroud)

是否有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
Run Code Online (Sandbox Code Playgroud)

注意:我更喜欢可以在日期范围内工作的函数.

Ant*_*ram 8

.Union将为您提供各种序列的独特组合.注意:如果您使用的是自定义类型,则需要为GetHashCode/Equals类内部提供替代,或者IEqualityComparer<T>在重载时提供类型.对于BCL类型,如intDateTime,你会没事的.

例:

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

编辑

如果不将它们全部链接在一个命令中,那么将所有范围结合起来的优雅方法是什么?

如果你有一系列的序列,无论是列表的集合,也许是一个锯齿状的数组,你都可以使用这个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();
Run Code Online (Sandbox Code Playgroud)

否则,您可以考虑创建自己的扩展方法来处理这个问题.

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]);
Run Code Online (Sandbox Code Playgroud)