C# 遍历树初始化变量

C# 遍历树初始化变量,c#,recursion,tree,C#,Recursion,Tree,如果你找到一个更合适的方式命名这个问题的标题,请随时更新 我有节点 public Class Node { public List<Node> Children = new List<Node>(); public Node Parent; public FileSystemInfo Value; } 这将使我能够执行强制转换,但我无法分配目录的大小 要获取目录的大小,可以使用此扩展方法 public static class Directory

如果你找到一个更合适的方式命名这个问题的标题,请随时更新

我有节点

public Class Node
{
    public List<Node> Children = new List<Node>();
    public Node Parent;
    public FileSystemInfo Value;
}

这将使我能够执行强制转换,但我无法分配目录的大小

要获取目录的大小,可以使用此扩展方法

public static class DirectoryInfoEx
{
    public static long GetDirectorySize(this DirectoryInfo di)
    {
        long size = 0;

        var fileInfos = di.GetFiles();
        foreach (var fi in fileInfos)
        {
            size += fi.Length;
        }

        var subDirInfos = di.GetDirectories();
        foreach (var subDir in subDirInfos)
        {
            size += GetDirectorySize(subDir);
        }

        return size;
    }
}
如果我理解正确,您只需要在
ScanItem
类的构造函数中添加两行代码

public ScanItem(Node node)
{                        
    this.Name = node.Name;
    this.FullPath = node.Value.FullName;
    DirectoryInfo di = new DirectoryInfo(this.FullPath);  //<<<<<<<
    this.Size = di.GetDirectorySize();                    //<<<<<<<

    foreach(var child in node.Children)
    {
         this.Children.add(new ScanItem(child));
    }
}
公共扫描项目(节点)
{                        
this.Name=node.Name;
this.FullPath=node.Value.FullName;

DirectoryInfo di=新的DirectoryInfo(this.FullPath);//
node.Name,node.FullName
我在
node
中看不到这些属性。但是这并不重要。我也在初始化构造函数中的其他变量。我感兴趣的唯一变量是目录的大小……为什么不遍历所有子文件来计算总大小……即使在操作系统中也是如此y在查询文件夹大小的同时确定文件夹大小。只是想一想:如果构造函数中的
node.Children
为空,则点击一个叶,因此首先设置
this.size=(node.Value为FileInfo)?((FileInfo)node.Value)。长度:0
,然后使用
ScanItem tmp=this“气泡添加”到根目录的大小;而(tmp.Parent!=null){tmp.Parent.Size+=tmp.Size;tmp=tmp.Parent;}
是的,我喜欢这个主意。每次我添加一个新文件时,我都会触发buble事件。不过那里有很多事件。我已经降低了10级(最高10级)然后计划将1000个文件添加到该目录,然后我将执行1000*10个事件…+1感谢您的帮助。这是可行的,但我将查找两次文件,从而使算法速度加倍。我忘了提到我运行递归方法,以便查找所有文件和目录,并返回一个节点对象及其对应项如果你做了两次,缓存它。基本缓存是一个字典,里面有你选择的id和要重用的值。你会失去一些内存,但会获得性能。
public static class DirectoryInfoEx
{
    public static long GetDirectorySize(this DirectoryInfo di)
    {
        long size = 0;

        var fileInfos = di.GetFiles();
        foreach (var fi in fileInfos)
        {
            size += fi.Length;
        }

        var subDirInfos = di.GetDirectories();
        foreach (var subDir in subDirInfos)
        {
            size += GetDirectorySize(subDir);
        }

        return size;
    }
}
public ScanItem(Node node)
{                        
    this.Name = node.Name;
    this.FullPath = node.Value.FullName;
    DirectoryInfo di = new DirectoryInfo(this.FullPath);  //<<<<<<<
    this.Size = di.GetDirectorySize();                    //<<<<<<<

    foreach(var child in node.Children)
    {
         this.Children.add(new ScanItem(child));
    }
}