从列表中初始化嵌套对象

问题描述:

我有一个整数列表(Levels)。我想初始化器称为myFilter如下的嵌套对象(Filter是具有两个属性的类:ValueNextFilter):从列表中初始化嵌套对象

var myFilter = new Fliter{ 
    Value = Levels[0], 
    NextFilter = new Filter{ 
     Value = Levels[1], 
     NextFilter = new Filter{ 
      Value = Levels[2], 
      NextFilter = new Filter{ 
       Value = Levels[n], 
       NextFilter = null 
      } 
     } 
    } 

} 

Levelcount是不是静态的,取决于输入列表中(我有一个多选列表,生成Level) 我该怎么做?

这是使用recursion经典的事件 - 一个方法调用自身的技术:

public static Filter CreateFilter(List<int> values) => values.Any() ? new Filter //If the list contains elements, create the filter 
{ 
    Value = values.First(), //assign the first item of the values to the value property 
    NextFilter = CreateFilter(values.Skip(1).ToList()) //Create the rest of the nested object with the rest of the values 
} : null; //If there aren't any items left in the list, return null and stop the recursion 

你当然可以做到这一点在构造函数,以及:

public Filter(List<int> values) 
{ 
    if (!values.Any()) return; 
    Value = values.First(); 
    NextFilter = values.Count > 1 ? new Filter(values.Skip(1).ToList()) : null; 
} 

更多关于递归的信息,看看这个:https://www.dotnetperls.com/recursion,欲了解嵌套类的更多信息,请阅读:https://www.dotnetperls.com/nested-class


递归数的更多信息:

实际上,你可以实现通过递归的一切 - 你甚至不需要循环。这就是为什么像这样的语言Haskell循环不存在的原因。 最简单的递归函数是:

public static void EndlessLoop() 
{ 
    //Loop body 
    EndlessLoop(); 
} 

然而,即使ReSharper的建议将其转换为一个循环: Resharper suggestion

另一个例子,如果你想获得一个列表的总和,你可以这样做:

public static int Sum(List<int> summands) => summands.Count > 0 
    ? summands.First() + Sum(summands.Skip(1).ToList()) 
    : 0; 

但是这些例子在C#中没有用,因为C#不是一种函数式编程语言,它使递归比循环慢。此外,递归经常导致*Exception(适合此网站)。如果你运行无限循环递归,它甚至不需要一秒钟,直到你的堆栈已满。

原因是,C#将从中调用方法的地址添加到堆栈。如果一个方法经常被调用(并且在1秒钟内会产生大量的递归调用),那么很多地址会被添加到堆栈中,以致它会溢出。

但我仍然认为,即使这些示例在c#中没有用处,它能够处理递归非常有用。递归是例如探索的目录结构,为获得例如所有文件的唯一方法:

public static List<FileInfo> GetAllFiles(DirectoryInfo directory) => directory.GetFiles() 
    .Concat(directory.GetDirectories().SelectMany(GetAllFiles)) 
    .ToList(); 

而且,正如你经验丰富,这是从列表填写一个嵌套类正确的唯一途径。

只需创建一个Filter的构造函数,即将Levels数组作为参数,将其值设置为level [0],并将init NextFilter = new Filter(level.Skip(1))。类似的东西。它会递归地初始化你的对象。