读取文本文件夹结构数据并使用c#.net查找根节点值的总和

时间:2017-06-10 18:35:21

标签: c# dictionary streamreader

读取包含文件夹结构数据的文本文件,并使用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

查找根节点值的总和

1 个答案:

答案 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()}");
}