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));
}
}