49

文字列からテキストを削除し、各行を空白行に置き換えます。

背景: 2つの文字列を比較するcompare関数を作成しています。そのすべてが正常に動作し、2つの別々のWebブラウザに表示されます。ブラウザで下にスクロールしようとすると、文字列の長さが異なります。削除するテキストを空白行に置き換えて、文字列の長さが同じになるようにします。

以下のコードでは、aDiff.Textの行数を数えようとしています。

これが私のコードです:

public string diff_prettyHtmlShowInserts(List<Diff> diffs)
    {
        StringBuilder html = new StringBuilder();

        foreach (Diff aDiff in diffs)
        {
            string text = aDiff.text.Replace("&", "&amp;").Replace("<", "&lt;")
              .Replace(">", "&gt;").Replace("\n", "<br>"); //&para;
            switch (aDiff.operation)
            {

                case Operation.DELETE:                              
                   //foreach('\n' in aDiff.text)
                   // {
                   //     html.Append("\n"); // Would like to replace each line with a blankline
                   // }
                    break;
                case Operation.EQUAL:
                    html.Append("<span>").Append(text).Append("</span>");
                    break;
                case Operation.INSERT:
                    html.Append("<ins style=\"background:#e6ffe6;\">").Append(text)
                        .Append("</ins>");
                    break;
            }
        }
        return html.ToString();
    }
4

11 に答える 11

86

方法1:

int numLines = aDiff.text.Length - aDiff.text.Replace _
                   (Environment.NewLine, string.Empty).Length;

方法2:

int numLines = aDiff.text.Split('\n').Length;

どちらもテキストの行数を示します。

于 2012-06-25T12:31:44.593 に答える
17

新しい文字列または文字列の配列を割り当てないバリアント

private static int CountLines(string str)
{
    if (str == null)
        throw new ArgumentNullException("str");
    if (str == string.Empty)
        return 0;
    int index = -1;
    int count = 0;
    while (-1 != (index = str.IndexOf(Environment.NewLine, index + 1)))
        count++;

   return count + 1;
}
于 2016-12-02T09:07:20.023 に答える
14

次のように、Linqを使用して行の出現回数をカウントすることもできます。

int numLines = aDiff.Count(c => c.Equals('\n')) + 1;

遅いですが、他の答えに代わるものを提供します。

于 2018-01-19T08:55:30.267 に答える
7

非効率的ですが、それでも:

var newLineCount = aDiff.Text.Split('\n').Length -1;
于 2012-06-25T12:32:10.700 に答える
6

さまざまなメソッド(Split、Replace、forループオーバー文字、Linq.Count)のパフォーマンステストを多数実行し、Replaceメソッドが勝者でした(文字列が2KB未満の場合、Splitメソッドはわずかに高速でしたが、それほど多くはありませんでした)。

しかし、受け入れられた答えには2つのバグがあります。1つのバグは、最後の行が改行で終わらない場合、最後の行をカウントしないことです。もう1つのバグは、WindowsでUNIX行末のファイルを読み取っている場合、Environment.Newlineが\r\n存在し、存在しないため、行がカウントされないことです(これは\n、 UNIXおよびWindows)。

だからここに簡単な拡張方法があります...

public static int CountLines(this string text)
{
    int count = 0;
    if (!string.IsNullOrEmpty(text))
    {
        count = text.Length - text.Replace("\n", string.Empty).Length;

        // if the last char of the string is not a newline, make sure to count that line too
        if (text[text.Length - 1] != '\n')
        {
            ++count;
        }
    }

    return count;
}
于 2016-06-26T04:45:33.117 に答える
4
int newLineLen = Environment.NewLine.Length;
int numLines = aDiff.text.Length - aDiff.text.Replace(Environment.NewLine, string.Empty).Length;
if (newLineLen != 0)
{
    numLines /= newLineLen;
    numLines++;
}

少し堅牢で、改行がない最初の行を考慮しています。

于 2016-01-20T15:04:20.410 に答える
4

効率的でコストが最小のメモリ。

Regex.Matches( "Your String" , System.Environment.NewLine).Count ;

もちろん、文字列クラスを拡張できます

using System.Text.RegularExpressions ;

public static class StringExtensions
{
    /// <summary>
    /// Get the nummer of lines in the string.
    /// </summary>
    /// <returns>Nummer of lines</returns>
    public static int LineCount(this string str)
    {
        return Regex.Matches( str , System.Environment.NewLine).Count ;
    }
}

参照:µBioDieter Meemken

于 2018-08-27T09:39:09.100 に答える
3

物事を簡単にするために、私はポンチャからの解決策を素晴らしい拡張方法に入れました、それであなたはそれをこのように簡単に使うことができます:

int numLines = aDiff.text.LineCount();

コード:

/// <summary>
/// Extension class for strings.
/// </summary>
public static class StringExtensions
{
    /// <summary>
    /// Get the nummer of lines in the string.
    /// </summary>
    /// <returns>Nummer of lines</returns>
    public static int LineCount(this string str)
    {
        return str.Split('\n').Length;
    }
}

楽しむ...

于 2016-04-12T12:55:19.463 に答える
3
using System.Text.RegularExpressions;

Regex.Matches(text, "\n").Count

'\n'速度とメモリ使用量を考慮すると、発生をカウントするのが最も効率的な方法だと思います。

文字列の新しい配列が作成されるため、パフォーマンスと効率が低下するため、使用split('\n')することはお勧めできません。特に、文字列が大きくなり、より多くの行が含まれる場合。

文字を空の文字に置き換え'\n'て差を計算することも効率的ではありません。検索、新しい文字列の作成、メモリ割り当てなどのいくつかの操作を実行する必要があるためです。

1つの操作、つまり検索を実行できます。'\n'したがって、@ lokimidgardが提案したように、文字列内の文字の出現を数えることができます。

前者(つまり)はUnixとWindowsの両方の行末で機能するため、文字の検索は(またはWindowsでの)'\n'検索よりも優れていることに言及する価値があります。"\r\n"Environment.NewLine'\n'

于 2018-08-08T15:05:48.517 に答える
3

ここでのパーティーに遅れましたが、これはすべての行を処理すると思います(少なくともWindowsでは):

Regex.Matches(text, "$", RegexOptions.Multiline).Count; 
于 2019-10-05T16:10:20.807 に答える
2
public static int CalcStringLines(string text)
{
    int count = 1;
    for (int i = 0; i < text.Length; i++)
    {
        if (text[i] == '\n') count++;
    }

    return count;
}

これは、それを行うための最速/最も簡単/メモリ割り当てなしの方法です...

于 2020-06-30T17:04:15.630 に答える