读取包含文件夹结构数据的文本文件,并使用c#.net。
查找根节点值的总和假设我在文本文件中有以下数据, 第一列是父文件夹 第二列是子文件夹 第3列是以MB为单位的数据
D研究50 学习笔记35 F音乐12 注释asp 25
需要在根文件夹中找到MB的总和
所以o / p将是
D 110 F 12
注意:在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
查找根节点值的总和答案 0 :(得分:0)
您需要一些文件夹结构。您无法添加输入子文件夹大小,也不能保存有关它的信息,因为稍后您会发现该子文件夹包含一些子文件夹。
所以,这个类/结构看起来像这样:
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()}");
}