将2D数组拆分为包含新行的数组
本文关键字:数组 包含新 拆分 2D | 更新日期: 2023-09-27 18:15:22
我有一个包含下一个值的2d数组。
1 t'2 3
2 f'5 b
4 f'b'g 6 8'9
通过'
分割数组后,我想接收
1 t 3
1 2 3
2 f b
2 5 b
4 f 6 8
4 f 6 9
4 b 6 8
4 b 6 9
4 g 6 8
4 g 6 9
我试过了,但是没有成功:
var result = row.Table.AsEnumerable()
.Where(r => r == row)
.SelectMany(r => this.projectMapping.Select(pm => r[pm.OriginalName]
.ToString()
.Split(this.separator, StringSplitOptions.None)));
我有一个生成序列组合的扩展方法。这个方法可以得到你的结果。
首先,2D数组中的每个数组本身必须转换为2D数组:
var array = new[]
{
new[] {"1", @"t'2", "3"},
new[] {"2", @"f'5", "b"},
new[] {"4", @"f'b'g", "6", @"8'9"},
};
var splitted = array.Select(a => a.Aggregate(new List<List<string>>(),
(seed, c) =>
{
seed.Add(c.Split(@"'".ToCharArray()).ToList());
return seed;
}));
现在splitted
是一个2D数组序列,每个数组必须组合在一起。为了可视化,这个序列的第一个元素是:
[1], [t,2], [3]
使用的扩展方法有:
static class EnumerableExtensions
{
public static IEnumerable<IEnumerable<T>> Combine<T>(this IEnumerable<IEnumerable<T>> listOfLists)
{
IEnumerable<IEnumerable<T>> seed = new List<List<T>> { new List<T>() };
return listOfLists.Aggregate(seed, (r, list) =>
r.SelectMany(a => list.Select(x => a.Append(x))));
}
public static IEnumerable<T> Append<T>(this IEnumerable<T> list, params T[] elements)
{
return list == null ? elements : list.Concat(elements);
}
}
使用Combine
法,
var result = splitted.SelectMany(s => s.Combine());
并将其可视化:
foreach (var element in result.Select(x => string.Join(", ", x)))
{
Console.WriteLine(element);
}
给:1, t, 3
1, 2, 3
2, f, b
2, 5, b
4, f, 6, 8
4, f, 6, 9
4, b, 6, 8
4, b, 6, 9
4, g, 6, 8
4, g, 6, 9
Combine
方法的思想是,对于每个进入它的序列,累积构建组合。取第一个序列[1], [t,2], [3]
,第一个聚合循环的结果是[1,t]
和[1,2]
。每一个与[3]
结合产生[1,t,3]
和[1,2,3]
。