我有一个整数列表(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
的{{1}}不是静态的,取决于输入列表(我有一个生成count
的多选列表)
我怎样才能做到这一点?
答案 0 :(得分:0)
只需构建一个Filter的构造函数,将Levels数组作为参数,将其值设置为level [0],并将init NextFilter设置为new Filter(level.Skip(1))。这样的事情。它会以递归方式初始化您的对象。
答案 1 :(得分:0)
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#不是函数式编程语言,导致递归比循环慢。此外,递归通常会导致 StackOverflowException (适合此站点)。如果你运行无限循环递归,它甚至不需要一秒钟,直到你的堆栈已满。
原因是,C#将调用方法的地址添加到堆栈中。如果经常调用一个方法(并在1秒内进行大量的递归调用),很多地址都会被添加到堆栈中,因此会溢出。
但是我仍然认为,尽管这些例子在c#中没用,但是能够处理递归是非常有用的。例如,递归是探索目录结构的唯一方法,例如获取所有文件:
public static List<FileInfo> GetAllFiles(DirectoryInfo directory) => directory.GetFiles()
.Concat(directory.GetDirectories().SelectMany(GetAllFiles))
.ToList();
而且,正如您所经历的那样,这是从列表中正确填充嵌套类的唯一方法。