5

コードをstring[]含む があります。各行には先頭にスペースが含まれています。既存のフォーマットを変更せずに、コードを可能な限り「インデント解除」する必要があります。

たとえば、私の内容string[]

                                         パブリック クラス MyClass
                                         {
                                             プライベート bool MyMethod(文字列 s)
                                             {
                                                 戻り値 == "";
                                             }
                                         }

それを変換するための合理的にエレガントで効率的な方法(LINQ?)を見つけたいと思います

パブリック クラス MyClass
{
    プライベート bool MyMethod(文字列 s)
    {
        戻り値 == "";
    }
}

明確にするために、私は探しています

IEnumerable<string> UnindentAsMuchAsPossible(string[] content)
{
    return ???;
}
4

6 に答える 6

3

これはうまくいくはずです:

static IEnumerable<string> UnindentAsMuchAsPossible(IEnumerable<string> input)
{
    int minDistance = input.Min(l => l.TakeWhile(Char.IsWhiteSpace).Count());
    return input.Select(l => l.Substring(minDistance));
}

コードを左に移動し、すべての行に同じ数のスペースを配置します。

例えば:

string testString = @"       
                     public class MyClass
                     {
                         private bool MyMethod(string s)
                         {
                             return s == "";
                         }
                     }";


string[] lines = testString.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
string[] unindentedArray = UnindentAsMuchAsPossible(lines).ToArray();
于 2013-05-23T15:45:23.447 に答える
1

目的のメソッド インターフェイスを一致させるには、次のようにします。

IEnumerable<string> UnindentAsMuchAsPossible(string[] content)
{
  int minIndent = content.Select(s => s.TakeWhile(c => c == ' ').Count()).Min();
  return content.Select(s => s.Substring(minIndent)).AsEnumerable();
}

これは、すべての行の最小インデントを取得し (スペースのみを想定し、タブは想定していません)、minIndent各行の先頭からスペースを取り除き、それを として返しますIEnumerable

于 2013-05-23T15:48:04.753 に答える