将2D数组拆分为具有新行的数组

时间:2016-10-27 18:59:48

标签: c# arrays linq datatable split

我有下一个值的二维数组。

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

1 个答案:

答案 0 :(得分:1)

我有一个产生序列组合的扩展方法。此方法可用于获取结果。

首先,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]