使用 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()}");
}