Advertisement
Guest User

Untitled

a guest
May 3rd, 2012
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.16 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Linq;
  5.  
  6. using System.Text.RegularExpressions;
  7. using System.IO;
  8.  
  9. namespace Hoge
  10. {
  11.     public class Test
  12.     {
  13.         class Reader
  14.         {
  15.             TextReader reader;
  16.             string cache;
  17.  
  18.             public Reader(TextReader reader) { this.reader = reader; }
  19.  
  20.             /// <summary>
  21.             /// 次の行を返す
  22.             /// </summary>
  23.             public string ReadLine() { cache = reader.ReadLine(); return cache; }
  24.  
  25.             /// <summary>
  26.             /// 今の行を返す
  27.             /// </summary>
  28.             public string PeekLine() { return cache; }
  29.         }
  30.  
  31.         IEnumerable<Folder> Folders(Reader sr)
  32.         {
  33.             var str = sr.ReadLine();
  34.  
  35.             while (str != null)
  36.             {
  37.                 if (IsSubFolder(str))
  38.                 {
  39.                     //いきなりサブフォルダはない
  40.                     throw new Exception();
  41.                 }
  42.                 else
  43.                 {
  44.                     yield return new Folder(str, SubFolders(sr));
  45.                     str = sr.PeekLine();
  46.                 }
  47.             }
  48.         }
  49.  
  50.         IEnumerable<SubFolder> SubFolders(Reader sr)
  51.         {
  52.             while (true)
  53.             {
  54.                 var str = sr.ReadLine();
  55.  
  56.                 if (str == null) yield break;
  57.  
  58.                 if (IsSubFolder(str))
  59.                 {
  60.                     yield return new SubFolder(SubFolderName(str));
  61.                 }
  62.                 else
  63.                 {
  64.                     yield break;
  65.                 }
  66.             }
  67.         }
  68.  
  69.         bool IsSubFolder(string s)
  70.         {
  71.             return s.StartsWith("..");
  72.         }
  73.  
  74.         string SubFolderName(string s)
  75.         {
  76.             return s.Substring(2);
  77.         }
  78.  
  79.         class Folder
  80.         {
  81.             public string Name;
  82.  
  83.             public Folder(string name, IEnumerable<SubFolder> subFolders)
  84.             {
  85.                 this.Name = name;
  86.                 SubFolders = subFolders;
  87.             }
  88.             public IEnumerable<SubFolder> SubFolders;
  89.         }
  90.  
  91.         class SubFolder
  92.         {
  93.             public string Name;
  94.             public SubFolder(string name)
  95.             {
  96.                 this.Name = name;
  97.             }
  98.         }
  99.  
  100.  
  101.         public static void Do()
  102.         {
  103.             var text =
  104. @"folder1
  105. ..subfolder1
  106. folder2
  107. ..subfolder1
  108. ..subfolder2";
  109.  
  110.             var sr = new StringReader(text);
  111.  
  112.             var folders = new Test().Folders(new Reader(sr));
  113.  
  114.            
  115.             foreach (var f in folders)
  116.             {
  117.                 Console.WriteLine(f.Name);
  118.  
  119.                 //fを取り出しているのにSubFoldersを列挙しないと、無限ループに突入する
  120.                 foreach (var s in f.SubFolders)
  121.                 {
  122.                     Console.WriteLine(s.Name);
  123.                 }
  124.             }
  125.         }
  126.     }
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement