@@ -33,38 +33,32 @@ private string TrimPreceding(string value, char character)
3333 {
3434 var lines = value . Split ( Environment . NewLine ) ;
3535 var preceding = CountPreceding ( lines , character ) ;
36- var trimmedLines = from line in lines
37- select TrimPrecedingLine ( line , character , preceding ) ;
36+ for ( var i = 0 ; i < lines . Length ; ++ i )
37+ {
38+ var line = lines [ i ] ;
39+ lines [ i ] = line . Length >= preceding ? line [ preceding ..] : string . Empty ;
40+ }
3841
39- return string . Join ( Environment . NewLine , trimmedLines ) ;
42+ return string . Join ( Environment . NewLine , lines ) ;
4043 }
4144
42- private int CountPreceding ( IEnumerable < string > lines , char leadingCharacter )
45+ private static int CountPreceding ( string [ ] lines , char leadingCharacter )
4346 {
47+ var min = int . MaxValue ;
4448 foreach ( var line in lines )
4549 {
46- // Make sure that the line actually starts with the leading character
47- if ( line . StartsWith ( leadingCharacter ) == false )
48- continue ;
49-
50- // Determine last index of leading character, return if something else is found
51- for ( var i = 0 ; i < line . Length ; i ++ )
50+ var lineSpan = line . AsSpan ( ) ;
51+ for ( var i = 0 ; i < lineSpan . Length ; ++ i )
5252 {
53- var character = line [ i ] ;
54- if ( character != leadingCharacter )
55- return i ;
53+ if ( lineSpan [ i ] != leadingCharacter )
54+ {
55+ min = i < min ? i : min ;
56+ break ;
57+ }
5658 }
57-
58- // Assume that this line is the template for trimming
59- return line . Length ;
6059 }
6160
62- throw new ArgumentException ( "No lines match the target leading character." , nameof ( lines ) ) ;
63- }
64-
65- private string TrimPrecedingLine ( string line , char character , int amount )
66- {
67- return line . StartsWith ( character ) ? new string ( line . Skip ( amount ) . ToArray ( ) ) : line ;
61+ return min ;
6862 }
6963 }
7064}
0 commit comments