using System;
using System.Linq ;
using System.Collections .Generic ;
namespace ConsoleApp1
{
static class Class1
{
private static IEnumerable< TNode> GetChildren< TNode> (
TNode node,
Func< TNode, IEnumerable< TNode>> GetNodes)
{
var nodes = GetNodes( node) ;
return nodes.Concat ( nodes.SelectMany ( x => GetChildren( x, GetNodes) ) ) ;
}
public static IEnumerable< TNode> GetChildrenRecursively< TRoot, TNode> (
this TRoot obj,
Func< TRoot, IEnumerable< TNode>> EnumRoot,
Func< TNode, IEnumerable< TNode>> GetNodes)
{
var nodes = EnumRoot( obj) ;
return nodes.Concat ( nodes.SelectMany ( x => GetChildren( x, GetNodes) ) ) ;
}
}
class Program
{
static void Main( string[ ] args)
{
int [ ] arr = { 1 , 2 , 3 , 4 } ;
var query = arr.GetChildrenRecursively < IEnumerable< int>, IEnumerable< int>> ( x => arr.Select ( y => new int [ ] { y } ) , x => arr.Except ( x) .Select ( y => x.Concat ( new int [ ] { y } .ToArray ( ) ) ) ) ;
foreach ( var item in query)
{
foreach ( var i in item) Console.Write ( i + " " ) ;
Console.WriteLine ( ) ;
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CgpuYW1lc3BhY2UgQ29uc29sZUFwcDEKewogICAgc3RhdGljIGNsYXNzIENsYXNzMQogICAgewogICAgICAgIHByaXZhdGUgc3RhdGljIElFbnVtZXJhYmxlPFROb2RlPiBHZXRDaGlsZHJlbjxUTm9kZT4oCiAgICAgICAgICAgIFROb2RlIG5vZGUsCiAgICAgICAgICAgIEZ1bmM8VE5vZGUsIElFbnVtZXJhYmxlPFROb2RlPj4gR2V0Tm9kZXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbm9kZXMgPSBHZXROb2Rlcyhub2RlKTsKICAgICAgICAgICAgcmV0dXJuIG5vZGVzLkNvbmNhdChub2Rlcy5TZWxlY3RNYW55KHggPT4gR2V0Q2hpbGRyZW4oeCwgR2V0Tm9kZXMpKSk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgc3RhdGljIElFbnVtZXJhYmxlPFROb2RlPiBHZXRDaGlsZHJlblJlY3Vyc2l2ZWx5PFRSb290LCBUTm9kZT4oCiAgICAgICAgICAgIHRoaXMgVFJvb3Qgb2JqLAogICAgICAgICAgICBGdW5jPFRSb290LCBJRW51bWVyYWJsZTxUTm9kZT4+IEVudW1Sb290LAogICAgICAgICAgICBGdW5jPFROb2RlLCBJRW51bWVyYWJsZTxUTm9kZT4+IEdldE5vZGVzKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG5vZGVzID0gRW51bVJvb3Qob2JqKTsKICAgICAgICAgICAgcmV0dXJuIG5vZGVzLkNvbmNhdChub2Rlcy5TZWxlY3RNYW55KHggPT4gR2V0Q2hpbGRyZW4oeCwgR2V0Tm9kZXMpKSk7CiAgICAgICAgfQogICAgfQoKICAgIGNsYXNzIFByb2dyYW0KICAgIHsKICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICAgICAgewogICAgICAgICAgICBpbnRbXSBhcnIgPSB7IDEsIDIsIDMsIDQgfTsKICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gYXJyLkdldENoaWxkcmVuUmVjdXJzaXZlbHk8SUVudW1lcmFibGU8aW50PiwgSUVudW1lcmFibGU8aW50Pj4oeCA9PiBhcnIuU2VsZWN0KHkgPT4gbmV3IGludFtdIHsgeSB9KSwgeCA9PiBhcnIuRXhjZXB0KHgpLlNlbGVjdCh5ID0+IHguQ29uY2F0KG5ldyBpbnRbXSB7IHkgfS5Ub0FycmF5KCkpKSk7CiAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIHF1ZXJ5KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaSBpbiBpdGVtKSBDb25zb2xlLldyaXRlKGkgKyAiICIpOwogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQo=