2

私は(グリッドではなく)チェスに取り組んでいます。このチェス(グリッドではない)にはX行があります。
各行にはYブロックがあります。

各行でどのような単語を見つけることができるか知りたいです。また、インデックスの開始と停止という言葉は何ですか。

したがって、1行の私の戦術は次のとおりです。

  • 行(-cat--dog ----)からすべてのアイテムを取得し、文字列に保存します
  • を使用して文字列のインデックスを操作するfor(...){...}

それは良い考えですか、それともその文字列をchar配列に変換してから操作する必要がありますか?

それを行うにはどの方法が速いですか?StringBuilderはどうですか?

@Oden thx修正用ですが、グリッドではなくチェスです:)


どこかで私はこの質問を間違って書いた。(質問の定式化を間違えたのかもしれません。この形を作るのは難しいので、ごめんなさい。)

主な問題の質問は、このトピックの主なタイトルに含まれているだけです。
たとえば、単語を処理する場合、どの方法が高速になりますかmamma--mia(各要素は、文字列形式などのansi記号です)。

したがって、文字列だけで作業している場合は、最初に文字列をCharArrayに変換してから作業するよりも高速になるのではないかと思います。または、stringBuilderを使用することもできます。

私は単に何が速いかを尋ねます:私のメソッドのworkまたはchars、stringsまたはstringbuilderの要素..:(大きな関数/メソッドで何が速くなるか->それが問題です。

4

3 に答える 3

2


1)ポイントを含むオブジェクトを作成し、 2)部分をモジュール化して文字列を解析することをお勧め
します(できればクラス内ですが、メソッドでも可能です)
。3)LINQを使用して、すべての行の値を取得します。あなたが探しているコラム

例は次のとおりです。

void Main()
{
    const string columnName = "ColumnYouSeek";

    var dgv = GetDataGridView(columnName);  
    var items = GetItems(dgv, columnName);
    // items now contains what you want
}    

値を保持するオブジェクトを作成します

 class ItemWithIndex
 {
    public string Text { get; set; }
    public int StartIndex { get; set; }
    public int EndIndex { get; set; }

    public override string ToString()
    {
        return string.Format(
                 "{0}: Starts at {1}, Ends at {2}", 
                 Text, StartIndex, EndIndex);
     }
 }

以下に変更して、DataGridViewをポイントします

public System.Windows.Forms.DataGridView GetDataGridView(string columnName)
{
    var dgv = new System.Windows.Forms.DataGridView();
    var column = new System.Windows.Forms.DataGridViewTextBoxColumn();
    column.DataPropertyName = columnName;
    column.Name = columnName;
    dgv.Columns.Add(column);
    dgv.Rows.Add("-cat--dog----");
    dgv.Rows.Add("--elephant----mouse----");
    return dgv;
}

アイテムを取得するためにモジュール化する

public IEnumerable<ItemWithIndex> GetItems(
        System.Windows.Forms.DataGridView dgv, string columnName)
{
    var rows = dgv.Rows.Cast<System.Windows.Forms.DataGridViewRow>();   
    var rowData = rows.Select(x => (x.Cells[columnName].Value ?? "").ToString());
    return rowData.SelectMany(x => GetWords(x));
}    

部分をモジュール化して個々の単語を取得します
注:これは単体テストおよびリファクタリングが可能です

public IEnumerable<ItemWithIndex> GetWords(string val)
{
    var index = val.IndexOf("-");
    while (index >= 0 && index + 1 < val.Length)
    {
        var startIndex = index + 1;
        var endIndex = val.IndexOf("-", startIndex);
        if (endIndex < 0)
            endIndex = val.Length - 1; // end of string
        var text = val.Substring(startIndex, endIndex - startIndex);
        index = endIndex;
        if (string.IsNullOrEmpty(text))
            continue;
        yield return new ItemWithIndex
                        {
                            Text = text,
                            StartIndex = startIndex,
                            EndIndex = endIndex,
                        };
    }
}
于 2011-11-05T20:17:19.393 に答える
2

あなたが直面しているパフォーマンスのボトルネックは、文字列の構造ではなく、探している単語を見つけることです。探している単語がm個ある場合は、文字列を調べて単語をm回検索することになります。それは必要ありません!*探しているすべての部分文字列に一致する巨大な正規表現を作成してみてください。それらが構築される方法*、文字列を1回だけ渡します(基本的に、「a」で始まる場合、「これはaで始まるすべての単語の始まりである可能性があります」という状態になります。次の文字は「b」で、状態は「これは、abで始まる単語の始まりか、bで始まる単語の始まりのいずれかである可能性があります)と言います。

于 2011-11-06T11:26:56.347 に答える
0

文字列の2次元配列、string[,]またはギザギザの配列(各行に同じ量のブロックがあるかどうかによって異なります)を使用する必要があるようです。

別のオプションは、リストの一般的なリストを使用することです- List<List<string>>

どちらのオプションでも、インデックスで直接データをクエリできます。

于 2011-11-05T16:43:38.657 に答える