展平可能包含数组的对象数组

Mat*_*and 2 c# linq arrays

我有一个IEnumerable<object>可能包含或不包含一些嵌套集合.例如,我的起点可能如下所示:

[ "foo", 2, [1, 2, 3, 4], "bar" ]
Run Code Online (Sandbox Code Playgroud)

我想把它压平为:

[ "foo", 2, 1, 2, 3, 4, "bar" ]
Run Code Online (Sandbox Code Playgroud)

我认为SelectMany应该在这里工作但是找不到合适的组合.我可以蛮力,但我认为应该有一个更优雅的解决方案.

Mar*_*zek 5

IEnumerable<object> source = new object[] { "test", 1, new[] { 1, 2, 3 }, "test" };

var result = source .SelectMany(x => x is Array ? ((IEnumerable)x).Cast<object>() : Enumerable.Repeat(x, 1));
Run Code Online (Sandbox Code Playgroud)

要使它与嵌套数组一起使用,使lambda递归:

IEnumerable<object> source = new object[] { "test", 1, new object[] { 1, 2, new [] { "nested", "nested2" } }, "test" };

Func<IEnumerable<object>, IEnumerable<object>> flatten = null;
flatten = s => s.SelectMany(x => x is Array ? flatten(((IEnumerable)x).Cast<object>()) : Enumerable.Repeat(x, 1));

var result = flatten(source);
Run Code Online (Sandbox Code Playgroud)

  • 那将不会处理嵌套数组. (2认同)