使用 c#.net 读取文本文件夹结构数据并查找根节点值的总和
read text file folder structure data and find sum of root node values using c#.net
读取包含文件夹结构数据的文本文件并使用 c#.net 查找根节点值的总和。
假设我在文本文件中有以下数据,
第一列是父文件夹
第二列是子文件夹
第三列是以 MB 为单位的数据
D 学习 50
学习笔记35
F 音乐 12
笔记 asp 25
需要查找根文件夹中的 MB 总和
所以 o/p 将是
D 110
F 12
注:笔记文件夹在study和study中D所以50+35+25.
到目前为止我所做的是创建字典并对它们的值求和,请查看下面的代码,
Dictionary<string, long> allTheThings = new Dictionary<string, long>();
using (System.IO.StreamReader sr = new System.IO.StreamReader(@"D:\Read.txt"))
{
while (!sr.EndOfStream)
{
string [] splitMe = sr.ReadLine().Split(' ');
if (allTheThings.Count == 0)
{
allTheThings.Add(splitMe[0], Convert.ToInt64(splitMe[2]));
}
else
{
if(allTheThings.ContainsKey(splitMe[0].ToString()))
{
allTheThings[splitMe[0]] += Convert.ToInt64(splitMe[2]);
}
else
{
allTheThings.Add(splitMe[0], Convert.ToInt64(splitMe[2]));
}
}
}
}
但是 o/p 我得到的是不正确的。
读取文本文件夹结构数据并使用 c# 查找根节点值的总和。net.read 文本文件文件夹结构数据并使用 c#.net
查找根节点值的总和
您需要一些文件夹结构。您不能添加输入子文件夹的大小,也不能保存有关它的信息,因为稍后您会发现该子文件夹包含一些子文件夹。
所以,这个 class/structure 看起来像这样:
class Folder
{
internal readonly Dictionary<string, Folder> SubFolders = new Dictionary<string, Folder>();
internal Folder Root = null;
internal string Name;
internal long Size;
internal long GetSum() => Size + SubFolders.Sum(item => item.Value.GetSum());
}
和代码:
class EqualityComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y) =>
string.Equals(x, y, StringComparison.OrdinalIgnoreCase);
public int GetHashCode(string obj) => obj.ToUpper().GetHashCode();
}
...
// You should modify code below for supporting fol->fol and "fol_1 fol_2 30 fol_1 fol_2 45"
Dictionary<string, Folder> allFolders = new Dictionary<string, Folder>(new EqualityComparer());
string[] folderInfo = null;
using (System.IO.StreamReader stream = new System.IO.StreamReader(@"C:\Read.txt"))
{
folderInfo = stream.ReadToEnd().Split(new[] { Environment.NewLine, " " }, StringSplitOptions.RemoveEmptyEntries);
}
for (int i = 0; i < folderInfo.Length; i += 3)
{
Folder folder = null;
Folder subFolder = null;
if (allFolders.TryGetValue(folderInfo[i], out folder))
{
subFolder = new Folder
{
Name = folderInfo[i + 1],
Size = Convert.ToInt64(folderInfo[i + 2]),
Root = folder
};
folder.SubFolders.Add(subFolder.Name, subFolder);
allFolders.Add(subFolder.Name, subFolder);
continue;
}
folder = new Folder { Name = folderInfo[i] };
subFolder = new Folder
{
Name = folderInfo[i + 1],
Size = Convert.ToInt64(folderInfo[i + 2]),
Root = folder
};
folder.SubFolders.Add(subFolder.Name, subFolder);
allFolders.Add(subFolder.Name, subFolder);
allFolders.Add(folder.Name, folder);
}
foreach (var item in allFolders.Where(folder => folder.Value.Root == null))
{
Console.WriteLine($"{item.Value.Name} {item.Value.GetSum()}");
}
读取包含文件夹结构数据的文本文件并使用 c#.net 查找根节点值的总和。
假设我在文本文件中有以下数据, 第一列是父文件夹 第二列是子文件夹 第三列是以 MB 为单位的数据
D 学习 50 学习笔记35 F 音乐 12 笔记 asp 25
需要查找根文件夹中的 MB 总和
所以 o/p 将是
D 110 F 12
注:笔记文件夹在study和study中D所以50+35+25.
到目前为止我所做的是创建字典并对它们的值求和,请查看下面的代码,
Dictionary<string, long> allTheThings = new Dictionary<string, long>();
using (System.IO.StreamReader sr = new System.IO.StreamReader(@"D:\Read.txt"))
{
while (!sr.EndOfStream)
{
string [] splitMe = sr.ReadLine().Split(' ');
if (allTheThings.Count == 0)
{
allTheThings.Add(splitMe[0], Convert.ToInt64(splitMe[2]));
}
else
{
if(allTheThings.ContainsKey(splitMe[0].ToString()))
{
allTheThings[splitMe[0]] += Convert.ToInt64(splitMe[2]);
}
else
{
allTheThings.Add(splitMe[0], Convert.ToInt64(splitMe[2]));
}
}
}
}
但是 o/p 我得到的是不正确的。 读取文本文件夹结构数据并使用 c# 查找根节点值的总和。net.read 文本文件文件夹结构数据并使用 c#.net
查找根节点值的总和您需要一些文件夹结构。您不能添加输入子文件夹的大小,也不能保存有关它的信息,因为稍后您会发现该子文件夹包含一些子文件夹。
所以,这个 class/structure 看起来像这样:
class Folder
{
internal readonly Dictionary<string, Folder> SubFolders = new Dictionary<string, Folder>();
internal Folder Root = null;
internal string Name;
internal long Size;
internal long GetSum() => Size + SubFolders.Sum(item => item.Value.GetSum());
}
和代码:
class EqualityComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y) =>
string.Equals(x, y, StringComparison.OrdinalIgnoreCase);
public int GetHashCode(string obj) => obj.ToUpper().GetHashCode();
}
...
// You should modify code below for supporting fol->fol and "fol_1 fol_2 30 fol_1 fol_2 45"
Dictionary<string, Folder> allFolders = new Dictionary<string, Folder>(new EqualityComparer());
string[] folderInfo = null;
using (System.IO.StreamReader stream = new System.IO.StreamReader(@"C:\Read.txt"))
{
folderInfo = stream.ReadToEnd().Split(new[] { Environment.NewLine, " " }, StringSplitOptions.RemoveEmptyEntries);
}
for (int i = 0; i < folderInfo.Length; i += 3)
{
Folder folder = null;
Folder subFolder = null;
if (allFolders.TryGetValue(folderInfo[i], out folder))
{
subFolder = new Folder
{
Name = folderInfo[i + 1],
Size = Convert.ToInt64(folderInfo[i + 2]),
Root = folder
};
folder.SubFolders.Add(subFolder.Name, subFolder);
allFolders.Add(subFolder.Name, subFolder);
continue;
}
folder = new Folder { Name = folderInfo[i] };
subFolder = new Folder
{
Name = folderInfo[i + 1],
Size = Convert.ToInt64(folderInfo[i + 2]),
Root = folder
};
folder.SubFolders.Add(subFolder.Name, subFolder);
allFolders.Add(subFolder.Name, subFolder);
allFolders.Add(folder.Name, folder);
}
foreach (var item in allFolders.Where(folder => folder.Value.Root == null))
{
Console.WriteLine($"{item.Value.Name} {item.Value.GetSum()}");
}