从列表中初始化嵌套对象
我有一个整数列表(Levels
)。我想初始化器称为myFilter
如下的嵌套对象(Filter
是具有两个属性的类:Value
和NextFilter
):从列表中初始化嵌套对象
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
}
}
}
}
Level
的count
是不是静态的,取决于输入列表中(我有一个多选列表,生成Level
) 我该怎么做?
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();
}
另一个例子,如果你想获得一个列表的总和,你可以这样做:
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))。类似的东西。它会递归地初始化你的对象。