linq 在C#中将3个数组串连/并集在一起

n6lpvg4x  于 2022-12-06  发布在  C#
关注(0)|答案(5)|浏览(253)

我有一个问题,如何在一行代码中连接或联合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)

不知道如何在单行中联合3个数组

irtuqstp

irtuqstp1#

您的代码的问题在于,在Where子句之后,Count是函数而不是属性。
另外一种更简洁的方法是将Union链接起来。另外,你也可以将 predicate 放在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
rkkpypqq

rkkpypqq2#

对于一个工会来说,你只需要

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);
3zwjbxry

3zwjbxry3#

以下代码将通过调用Concat来连接数组。
然后通过调用Distinct删除重复的数字。
最后,通过调用 predicate 大于或等于零的Where来过滤数字。

var arr1 = new[] {1, 2, 3, -5, 2, 0};
        var arr2 = new[] {1, 2, 3, -1, 5, 0};
        var arr3 = new[] {1, 2, 3, -6, 2, 9};
        var result = arr1
            .Concat(arr2)
            .Concat(arr3)
            .Distinct()
            .Where(i => i >= 0)
            .ToArray();
zpqajqem

zpqajqem4#

可以在一行代码中完成。使用linq SelectMany扁平化数组或列表。

// Set up array of arrays sample.
var a1 = new string[] { "z","x","d" };
var a2 = new string[] { "a","e","i" };
var a3 = new string[] { "q","m","w" };
var arrays = new string[][] { a1, a2, a3 };

var r = arrays.SelectMany(s => s);
jmo0nnb3

jmo0nnb35#

多个数组的一般串连。

//
    //
    ///<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;
    }

相关问题