3

私はC#/。NET 4.5でアプリを作成しており、次のように定義された辞書があります。

Dictionary<int, string> d = new Dictionary<int, string>();

私の整数キーはシーケンシャルで一意であり、空の文字列を除いて、私の値も一意になります。例えば:

Key     Value
  0     AAAAAAAAAA
  1     BBBBBB
  2     (empty string)
  3     CCCCCCCCCCCCCCCCCCCCCCCC
  4     DDDDDDDDDDDDDDD
  5     EEEEEEEEEEEEEEEEEEE
  6     (empty string)

辞書に追加する新しい文字列がある場合、(空の文字列)の値を持つキーの1つにそれを割り当てる必要があります。理想的には、そのようなキーの最初のインスタンスでこれを実行したいと思います。私は現在、次のように辞書をループしています。

int keyNumber;

foreach (KeyValuePair<int, string> pair in d)
{
    if (pair.Value == string.Empty)
    {
        keyNumber = pair.Key;
        break;
    }
}

d[keyNumber] = "new string goes here!";

これは機能しますが、同じことを達成するためのより良い(またはより速い)方法はありますか?これが実際に最善のアプローチである場合、それをLINQ式に短縮することは可能ですか?

編集 - - - - - - - - - - - - - - - - - - - - - - - - - ----------------------------

おそらく説明するのに重要なことは省略しました。私の辞書にロードされる値は、実際には、ASCII文字列を保持する固定長のバイト配列で構成されるバイナリファイルからロードされます。ファイルは常に5000000バイトまたは合計100000文字列@それぞれ50バイトで構成されます。ファイル構造は、ファイルを消費するデバイスのハードウェア制限によって決定されました。したがって、辞書内の各KeyValuePairのキーは、実際には、ユーザーが変更を加え終わったときに変更を書き込む必要があるファイルへのオフセットを決定するために使用されます。たとえば、4のキーを使用して、50を掛けて開始オフセットを200バイトにします。次に、変更した文字列をその場所に書き戻します。私の元の投稿でそれを省略して申し訳ありません。

4

4 に答える 4

3
d[d.FirstOrDefault(x => string.IsNullOrEmpty(x.Value)).Key] = "My String";

ただし、辞書は実際には真のキーと値のペアを格納することを目的としています。リストは、実際に値を格納するだけでよいように見える場合に適しているように思われます。それでも、リスト要素にはインデックスでアクセスでき、空の要素を含めることができるので、(あなたが述べたことから)辞書に固執する理由はないようです。

于 2012-12-11T19:29:23.680 に答える
1

Dictionaryあなたがやろうとしていることに対して、Aは最良の選択ではないかもしれません。単純List<>または配列を試してください。

ADictionaryは、ある一意の値を別の一意でない値にマップするための最適化された方法です。それ以上のことをしようとしている場合は、独自のコレクションを実装する方が適切です。

于 2012-12-11T19:34:50.663 に答える
1

空の文字列値を持つエントリがあることがわかっている場合は、次を使用できます。

var kvp = d.First(p => p.Value == string.Empty);
d[kvp.Key] = "new string goes here!";
于 2012-12-11T19:35:04.793 に答える
1

コメントが言うように、私はそれをお勧めしません、あなたはリストを使うべきです。しかし、ここに2つの例があります。

  Dictionary<int, string> d = new Dictionary<int, string>();
  string valueToBeInserted = "randomstring";
  var keyValuePair = d.FirstOrDefault(c => c.Value == string.Empty);
  d[keyValuePair.Key] = valueToBeInserted;

簡略化:

 Dictionary<int, string> d = new Dictionary<int, string>();
 string valueToBeInserted = "randomstring";
 d[d.FirstOrDefault(c => c.Value == string.Empty).Key] = valueToBeInserted;
于 2012-12-11T19:39:49.060 に答える