2017-06-09 7 views
-2

私は最近@edplunkettすることにより、このコードを見て、私はインデント含めるように変更したいのですが、これは私がしかし、やっている何かで有用であろうと思った:インデントを含めるには、これを変更するために何が必要ですか?

static void Main() 
{ 
var randomCrap = new List<Object> 
{ 
    1, "two", 
    new List<object> { 3, 4 }, 
    5, 6, 
    new List<object> { 
     new List<object> { 7, 8, "nine" }, 
    }, 
}; 

randomCrap.PrintAll(); 
} 

public static class Extensions 
{ 
    public static void PrintAll(this Object root) 
    { 
     foreach (var x in root.SelectAll()) 
     { 
      Console.WriteLine(x); 
     } 
    } 

    public static IEnumerable<Object> SelectAll(this object o) 
    { 
     // Thank you, eocron 
     if (o is String) 
     { 
      yield return o; 
     } 
     else if (o is IEnumerable) 
     { 
      var e = o as IEnumerable; 
      foreach (var child in e) 
      { 
       foreach (var child2 in child.SelectAll()) 
        yield return child2; 
      } 
     } 
     else 
     { 
      yield return o; 
     } 
    } 
} 

それはインデントを毎回追加する方法は簡単ですがすべてのIEnumerable遭遇した1ずつ増加0の開始インデントなどの

1 
two 
    3 
    4 
5 
6 
    7 
    8 
    nine 

何か:あなたがこれを取得したいようIEnumerableが発生しましたか?

+0

ハハハ! 'randomCrap'です。私はどこから来たのか知っています。 – itsme86

答えて

0

あなたはタプルでかなり簡単にそれを行うことができます。

public static class Extensions 
{ 
    public static void PrintAll(this Object root) 
    { 
     foreach (var x in root.SelectAll("")) 
     { 
      Console.WriteLine(x.Item1 + x.Item2); 
     } 
    } 

    public static IEnumerable<(string, Object)> SelectAll(this object o, string indentation) 
    { 
     // Thank you, eocron 
     if (o is String) 
     { 
      yield return (indentation, o); 
     } 
     else if (o is IEnumerable) 
     { 
      var e = o as IEnumerable; 
      foreach (var child in e) 
      { 
       foreach (var child2 in child.SelectAll(indentation + " ")) 
        yield return (child2.Item1, child2.Item2); 
      } 
     } 
     else 
     { 
      yield return (indentation, o); 
     } 
    } 
} 

編集:ここでは、プリC#7ですバージョン(テストされていませんが、動作するはずです):

public static class Extensions 
{ 
    public static void PrintAll(this Object root) 
    { 
     foreach (var x in root.SelectAll("")) 
     { 
      Console.WriteLine(x.Item1 + x.Item2); 
     } 
    } 

    public static IEnumerable<Tuple<string, Object>> SelectAll(this object o, string indentation) 
    { 
     // Thank you, eocron 
     if (o is String) 
     { 
      yield return Tuple.Create(indentation, o); 
     } 
     else if (o is IEnumerable) 
     { 
      var e = o as IEnumerable; 
      foreach (var child in e) 
      { 
       foreach (var child2 in child.SelectAll(indentation + " ")) 
        yield return Tuple.Create(child2.Item1, child2.Item2); 
      } 
     } 
     else 
     { 
      yield return Tuple.Create(indentation, o); 
     } 
    } 
} 
+0

ええと...私たちはほぼ同じ時期に同じ結論に達しました... –

+0

@JamesCurran Yeah。少し異なる実装ですが、同じアイデアです。 – itsme86

+0

@ itsme86これに感謝しますが、私はこれを動作させることができません。私がコピーして貼り付けると、 'public static IEnumerable <(string、Object)> SelectAll(このオブジェクトは文字列インデント)'行の 'SelectAll'キーワードに'メソッドは戻り値型を持たなければなりません。 'yield return(indentation、o);'の後に 'syntax error => expected'と表示されます。あなたはそれが働いているように見えるので、私は何かが分かりません。 – Monika

0

これはかなり大きな変更になります。今は、関数に渡して単一のオブジェクトを返しています。渡すためには、オブジェクトとインデントレベルの2つを返す必要があります。これはできますが、エドプランケットのデザインの優雅さは破壊されます。

UPDATE:実際には、タプルで、それは結局それほど悪くはありません::

static void Main() 
{ 
    var randomCrap = new List<Object> 
{ 
    1, "two", 
    new List<object> { 3, 4 }, 
    5, 6, 
    new List<object> { 
     new List<object> { 7, 8, "nine" }, 
    }, 
}; 

    randomCrap.PrintAll(); 
} 

public static class Extensions 
{ 
    public static void PrintAll(this Object root) 
    { 
     foreach (var x in root.SelectAll(0)) 
     { 
      Console.WriteLine("{0}{1}", new string('_', x.indent),x.obj); 
     } 
    } 

    public static IEnumerable<(Object obj,int indent)> 
        SelectAll(this object o, int indent) 
    { 
     // Thank you, eocron 
     if (o is String) 
     { 
      yield return (o,indent); 
     } 
     else if (o is IEnumerable) 
     { 
      var e = o as IEnumerable; 
      foreach (var child in e) 
      { 
       foreach (var child2 in child.SelectAll(indent+1)) 
        yield return child2; 
      } 
     } 
     else 
     { 
      yield return (o, indent); 
     } 
    } 
} 
関連する問題