Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Linq;
- using System.Text.RegularExpressions;
- using System.IO;
- namespace Hoge
- {
- public class Test
- {
- class Reader
- {
- TextReader reader;
- string cache;
- public Reader(TextReader reader) { this.reader = reader; }
- /// <summary>
- /// 次の行を返す
- /// </summary>
- public string ReadLine() { cache = reader.ReadLine(); return cache; }
- /// <summary>
- /// 今の行を返す
- /// </summary>
- public string PeekLine() { return cache; }
- }
- IEnumerable<Folder> Folders(Reader sr)
- {
- var str = sr.ReadLine();
- while (str != null)
- {
- if (IsSubFolder(str))
- {
- //いきなりサブフォルダはない
- throw new Exception();
- }
- else
- {
- yield return new Folder(str, SubFolders(sr));
- str = sr.PeekLine();
- }
- }
- }
- IEnumerable<SubFolder> SubFolders(Reader sr)
- {
- while (true)
- {
- var str = sr.ReadLine();
- if (str == null) yield break;
- if (IsSubFolder(str))
- {
- yield return new SubFolder(SubFolderName(str));
- }
- else
- {
- yield break;
- }
- }
- }
- bool IsSubFolder(string s)
- {
- return s.StartsWith("..");
- }
- string SubFolderName(string s)
- {
- return s.Substring(2);
- }
- class Folder
- {
- public string Name;
- public Folder(string name, IEnumerable<SubFolder> subFolders)
- {
- this.Name = name;
- SubFolders = subFolders;
- }
- public IEnumerable<SubFolder> SubFolders;
- }
- class SubFolder
- {
- public string Name;
- public SubFolder(string name)
- {
- this.Name = name;
- }
- }
- public static void Do()
- {
- var text =
- @"folder1
- ..subfolder1
- folder2
- ..subfolder1
- ..subfolder2";
- var sr = new StringReader(text);
- var folders = new Test().Folders(new Reader(sr));
- foreach (var f in folders)
- {
- Console.WriteLine(f.Name);
- //fを取り出しているのにSubFoldersを列挙しないと、無限ループに突入する
- foreach (var s in f.SubFolders)
- {
- Console.WriteLine(s.Name);
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement