web-dev-qa-db-ja.com

StringBuilderの行数を取得する方法は?

たとえば、StringBuilderインスタンスを使用して、多数のsb.AppendLine("test");を実行しています。

行数はどのように計算できますか?

クラスには.Lengthしかし、それは全部でいくつの文字を私に教えてくれます。

何か案は?

26
Jon

効率で並べ替え:

  1. AppendLine()呼び出しのカウント
  2. ループでIndexOf()を呼び出す
  3. 正規表現の使用
  4. String.Split()の使用

最後のものは、非常に高価であり、lotsのゴミを生成します。使用しないでください。

25
Hans Passant

StringBuilderを独自のクラスでラップして、行が追加されたときに行数を維持するか、ビルダーがいっぱいになった後の '\ n'の数を維持することができます。

Regex.Matches(builder.ToString(), Environment.NewLine).Count
21
Jake Pearson

次のようにしてラッパークラスを作成できます。

public class Wrapper
{
    private StringBuilder strBuild = null;
    private int count = 0;
    public Wrapper(){
        strBuild = new StringBuilder();
    }
    public void AppendLine(String toAppendParam){
        strBuild.AppendLine(toAppendParam);
        count++;
    }
    public StringBuilder getStringBuilder(){
        return strBuild;
    }

    public int getCount(){
        return count;
    }
}
6
Koekiebox

これを試して:

sb.ToString().Split(System.Environment.NewLine.ToCharArray()).Length;
3
Bravax

[〜#〜] update [〜#〜]Gabeの発言

b.ToString()。Count(c => c == '\ n')もここで機能し、(文字列の個別のコピーを作成することを除いて)それほど効率的ではない可能性があります。


StringBuilderから文字列を作成して分割する(または文字列を作成してregexingする)よりも速い方法は、StringBuilderを調べて、そこにある'\n'文字の数を数えることです。

次の拡張メソッドは、文字列ビルダーの文字を列挙します。コンテンツが完成するまでそれをlinqできます。

    public static IEnumerable<char> GetEnumerator(this StringBuilder sb)
    {
        for (int i = 0; i < sb.Length; i++)
            yield return sb[i];
    }

...ここで使用、カウントは4になります

        StringBuilder b = new StringBuilder();
        b.AppendLine("Hello\n");
        b.AppendLine("World\n");

        int lineCount = b.GetEnumerator().Count(c => c =='\n');
2
Binary Worrier

文字列内の\ nの出現回数を検索できるはずです。

更新:1つの方法は、改行文字で分割し、次のように配列の要素数をカウントすることです。

sb.ToString().Split('\n').length;
2
Paul Hadfield

String.Split()を使用する場合は、いくつかのオプションで文字列を分割する必要があります。このような:

static void Main(string[] args)
{
    var sb = new StringBuilder();
    sb.AppendLine("this");
    sb.AppendLine("is");
    sb.AppendLine("a");
    sb.AppendLine("test");

    // StringSplitOptions.None counts the last (blank) newline 
    // which the last AppendLine call creates
    // if you don't want this, then replace with 
    // StringSplitOptions.RemoveEmptyEntries
    var lines = sb.ToString().Split(
        new string[] { 
            System.Environment.NewLine }, 
        StringSplitOptions.None).Length;

    Console.WriteLine("Number of lines: " + lines);

    Console.WriteLine("Press enter to exit.");
    Console.ReadLine();
}

これは次の結果になります:

Number of lines: 5

2
code4life

独自の行カウントStringBuilderを導出します。ここで、AppendLineは内部行カウントを増やし、行カウントの値を取得するメソッドを提供します。

1
JLWarlow

正規表現を実行して、文字列内の行終了文字(例:\ r\n)の数をカウントします。または、文字列をテキストボックスに読み込んで行数を計算しますが、それはそれを行う方法です。

0
Ayubinator

StringbuilderデータをString []配列に分割し、行数としてString []。Lengthを使用できます。

以下のようなもの:

String[] linestext = sb.Split(newline)
Console.Writeline(linetext.Length)
0
swapneel