C#中的Concat / union 3阵列在一起

时间:2017-05-04 20:37:07

标签: c# arrays linq

我有一个问题如何在一行代码中连接或联合3个数组? 我有Visual Studio 2015,它看起来像

int[] array1 = {1 ,2 ,3 ,-5 ,2 ,0 };
int[] array2 = {1 ,2 ,3 ,-1 ,5 ,0 };
int[] array3 = {1 ,2 ,3 ,-6 ,2 ,9 };

我想点击按钮就可以了:

Console.WriteLine(array1.Union(array2.Union(array3)).Where((x) => x >=0).Count)

Dunno rly如何在单行中使用Union 3数组

3 个答案:

答案 0 :(得分:2)

代码的问题在于Where子句之后Count是一个函数而不是属性。

此外,更简洁的方法是将Union链接起来。您也可以将谓词放在Count中:

Console.WriteLine(array1.Union(array2).Union(array3).Count(x => x >= 0));

要仅打印所有数组的正值,请使用string.Join

Console.WriteLine(string.Join(",", array1.Union(array2).Union(array3).Where(x => x >= 0)));
//Prints: 1, 2, 3, 0, 5, 9

答案 1 :(得分:0)

对于你需要的联盟

array1.Union(array2).Union(array3)

然后您可以编写和/或计算生成的IEnumerable。联盟忽略了重复:如果你想保留所有3个数组(以及连续数组而不是某些列表/集合类型)的所有值,你可以这样做:

var concatenated = new int[array1.Length + array2.Length + array3.Length];
array1.CopyTo(concatenated, 0);
array2.CopyTo(concatenated, array1.Length);
array3.CopyTo(concatenated, array1.Length + array2.Length);

答案 2 :(得分:0)

多个数组的通用串联。

    //
    //
    ///<summary>Create a new array as concatenation of all given arrays.</summary>
    public static T[] Concatenate<T>( params T[][] args ) {
        if ( null == args ) return null;
        // Get argument lengths
        var count = args.Length;
        if ( 0 == count ) return null;
        var lengths = new int[ count ];
        // Compute all and total lengths
        var total = 0;
        for ( int i = 0; i < count; i++ ) {
            lengths[ i ] = null == args[ i ] ? 0 : args[ i ].Length;
            total += lengths[ i ];
        }
        if ( 1 > total ) return null;
        // Create target array
        T[] a = new T[ total ];
        // Copy all together
        total = 0;
        for ( int i = 0; i < count; i++ ) {
            if ( null != args[ i ] ) {
                args[ i ].CopyTo( a, total );
            }
            total += lengths[ i ];
        }
        return a;
    }