0

次のような固定の順序付けされたインデックス値を持つ 100,000 個の文字列があります。

Index   String Value
  0     XXXXXXXXXXXXXXXXXXXXX
  1     XXXXXXXXXX
  2     (empty string)
  3     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  4     XXXXX
  5     XXXXXXXXX
  6     XXXXXXXXXXXXXXX
  7     (empty string)
  8     XX
  9     XXXXXXXXXX
 10     XXXXXXXXXXXXXXXXXXXXXXXXXX
 ...    ...
99999   XXXXXXXXXXXXXXXXXXX

私のデータ構造は正確に 100,000 個の順序付きエントリを保持する必要があり、文字列値の一部 (または多く) は、少なくとも最初は空である可能性があります。各インデックス値は一意 (連続した整数) であり、空の文字列を除いて、各文字列値も一意です。UI に表示するために、通常はデータ構造にデータを入力し、リスト ボックスをそれにバインドします (DisplayMember と ValueMember を指定して)。ただし、この場合、空ではない文字列のみを表示したいと考えています。したがって、おそらく、次のような方法で、データ構造を繰り返し処理し、該当する項目をリスト ボックスに追加する必要があります。

foreach (item in MyDataStructure)
{
    if (item.StringValue != string.Empty)
    {
        listBox1.Items.Add(item);
    }
}

各文字列とそのインデックス値の間の関係を常に維持できることは、私にとって非常に重要です。ご想像のとおり、私のユーザーは文字列を追加/編集/削除する必要があります。理論的には、3 つの操作はすべて、特定のインデックスで文字列値を更新するという同じことになります。新しい文字列を追加するには、まずデータ構造を繰り返し処理し、空の文字列がどこかにあることを確認して、それを新しい文字列に置き換える必要があります。空の文字列が存在しない場合、ユーザーは最初に既存の文字列を「編集」するか、別の文字列を「削除」する必要があります。これは、固定数の合計文字列 (100k) を扱っているためです。プログラムの観点からは、文字列を「削除」することも、データ構造の適切なインデックスで空/null 文字列に置き換えるだけの問題です。

私が予見できる限り、次のことを簡単に実行できるデータ構造が必要になります。

  1. 空でないすべての文字列のインデックスと文字列の値をリスト ボックスに追加し、インデックスを ValueMember として使用し、文字列を DisplayMember として使用します。
  2. 特定のインデックスのデータ構造をすばやく検索し、その文字列値を取得します
  3. 文字列のデータ構造をすばやく検索して、それが既に存在するかどうかを確認します

これらのことを念頭に置いて、タスクに適した特定のデータ構造を推奨できる人はいますか? 最初は、各インデックス/文字列を保持するためのキー/値のペアを持つ辞書を考えていました。次に、合計サイズが固定され、配列インデックス自体が各文字列値のインデックス値としても機能する可能性があるため、誰かが配列を使用することを提案しました。

4

4 に答える 4

2

一定量の項目がListあり、項目ごとにインデックスが必要な場合は、配列以外を探す必要はありません。

string[] arr = new string[100000];

配列にもアクセスLINQできるので、基準を満たすことができます。

//1
arr.Where(x => !string.IsNullOrEmpty(x)).Select(str => new { value = Array.IndexOf(arr, str), display = str });
//2
string str = arr[index];
//3
arr.Any(x => x == "SomeString");
于 2012-12-12T16:36:04.430 に答える
0

私の最初の考えは、二重辞書です。基本的に2 つの辞書を保持します。

Dictionary<int, string> // index-->value
Dictionary<string, int> // value-->index

ディクショナリを同期させるにはもう少し手間がかかりますが、値で多くの検索を行う場合は、その価値があるかもしれません。

配列を使用すると、値を検索するたびに線形検索が必要になるため、最もパフォーマンスが高くなるとは思いません。

また、どちらのディクショナリにも空白/null 値を保存しない場合は、フィルタリングを行わなくても直接バインドできます。

于 2012-12-12T16:34:59.723 に答える
0

もちろん、これを行う方法はたくさんありますが、SortedDictionary<int, string>空でない文字列で をカプセル化するよりもコレクション クラスを作成できます。

于 2012-12-12T16:35:09.617 に答える
0

私はあなたがこれについて間違った方法で行っていると思います.5MBのメモリ制限があり、空の文字列を保持するもの全体を使用するつもりですか? このデータ構造は 5MB でも保持されるのでしょうか? これにより、保持できる文字列の数が制限されます。文字列はどのようにこのメモリに保持されていますか? ある種のデータベース?これが何に使われているかはわかりませんが、ユーザーが 100,000 個の文字列をすべて使用すると本当に思いますか? 私はそれを非常に疑っています。

また、キーが文字列値にどのように関連しているかはまだわかりませんが、100,000 個のアイテムのリストを持つことは本当に意味がありません。ほとんどの場合、それらの多くは空の文字列です。それが作成する検索/挿入/削除のオーバーヘッドは言うまでもなく、メモリの無駄です。速度を考えると、現在使用されているものだけのリストを保持する方がはるかに理にかなっています。

NoSQL可能であれば、データベースを使用することをお勧めします。ユーザーが作成した文字列を挿入すると、インデックス値が得られ、文字列を自由に更新できます。ユーザーが文字列を削除/空の文字列に設定した場合は、データベースから削除できます (または、このアイデアに非常に熱心なので、データベース内の空の文字列に設定します)。100,000 文字列の制限に達するまで挿入を続けます。

于 2012-12-12T17:16:19.457 に答える