如何使用Enumerable将多个集合合并为结构体集合?
合并等长数组的对应元素
你不需要用Enumerable.Join(),因为它是基于键值匹配的,而你要的是按索引位置配对,直接用Enumerable.Zip()方法就可以,它专门用来将多个等长序列的对应元素组合到一起。
三个数组合并示例
假设你的数组元素是自定义类型,比如:
public class ItemA { public int Id { get; set; } } public class ItemB { public string Name { get; set; } } public class ItemC { public decimal Price { get; set; } }
你可以先把A和B合并,再将合并结果和C组合,最终得到包含三个元素的结果数组:
var result = A.Zip(B, (a, b) => new { A = a, B = b }) .Zip(C, (ab, c) => new { ab.A, ab.B, C = c }) .ToArray();
如果需要合并成自定义的实体类,比如:
public class CombinedItem { public ItemA ItemA { get; set; } public ItemB ItemB { get; set; } public ItemC ItemC { get; set; } }
代码可以改成:
var result = A.Zip(B, (a, b) => new { A = a, B = b }) .Zip(C, (ab, c) => new CombinedItem { ItemA = ab.A, ItemB = ab.B, ItemC = c }) .ToArray();
处理更多数组的扩展方法
如果以后要合并更多等长数组,可以写个扩展方法简化操作:
public static class EnumerableExtensions { public static IEnumerable<TResult> ZipThree<T1, T2, T3, TResult>( this IEnumerable<T1> source1, IEnumerable<T2> source2, IEnumerable<T3> source3, Func<T1, T2, T3, TResult> resultSelector) { using var enum1 = source1.GetEnumerator(); using var enum2 = source2.GetEnumerator(); using var enum3 = source3.GetEnumerator(); while (enum1.MoveNext() && enum2.MoveNext() && enum3.MoveNext()) { yield return resultSelector(enum1.Current, enum2.Current, enum3.Current); } } }
用起来就更简洁:
var result = A.ZipThree(B, C, (a, b, c) => new CombinedItem { ItemA = a, ItemB = b, ItemC = c }).ToArray();
注意事项
- 如果数组长度不一致,
Zip会以最短的数组为准,停止合并后续元素。 - 要是需要确保所有数组长度完全相同,可以先加个检查:
if (A.Length != B.Length || A.Length != C.Length) { throw new ArgumentException("所有数组长度必须一致"); }
内容的提问来源于stack exchange,提问作者user3001150
相关产品推荐
相关产品推荐

