我有一个问题如何在代码的一行中concat或联合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如何在单行中结合3个数组
代码的问题是,在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
对于联合,您只需要
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);
以下将通过调用concat来加入数组。
然后通过调用不同的删除复制的数字。
最后通过调用谓词更大或等于零的位置来滤除数字。
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();
可以在一行代码中完成。使用linq selectany来扁平数组或列表。
// 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);
多个数组的通用串联。
//
//
///<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;
}