1

データベースから入力したディクショナリがあります。

返されるレコードが 1 つだけの場合、KeyValuePair にアクセスするにはどうすればよいですか?

私はこのコードを持っています:

Dictionary<int, string> CandidatePlatypiDict = PlatypusID > 0 ? DuckbillData.GetPlatypusById(PlatypusID) :  DuckbillData.GetCandidatePlatypiFromName(SearchVal);
KeyValuePair<int, String> kvp;

...これにより、ディクショナリに問題なく入力されます。複数の KVP がある場合、それらを DGV に表示してから、次のように kvp に割り当てます。

DataGridViewRow selectedRow = dataGridViewPlatypi.Rows[selectedrowindex];
int i = Convert.ToInt32(selectedRow.Cells["DuckBillAccountNum"].Value);
string s = Convert.ToString(selectedRow.Cells["DuckBillName"].Value);
this.PlatypiKVP = new KeyValuePair<int, string>(i, s);

...しかし、レコードが 1 つしかない場合は、DGV に値を表示する必要はありません。実際に選択する必要がないため、その値を使用するだけです。しかし、これまでのところ、必要な値 kvp.Key と kvp.Value を割り当てる方法について空白を描いています。

if (CandidatePlatypiDict.Count == 1)
{
    //kvp.Key = CandidatePlatypiDict[0].     strike 1
    //kvp.Key = CandidatePlatypiDict.Keys[0] strike 2
    // ???
}
4

3 に答える 3

3

First()または必要に応じて使用できSingle()ます。例えば:

if (CandidatePlatypiDict.Count == 1)
{
    var firstPair = CandidatePlayDict.First();

    // can then access firstPair.Key and firstPair.Value
    ...
}

Single()との間には多くのフレーバーがありFirst()ますが、それはあなたが望むものに依存します。

複数のアイテムが存在する場合でも、最初のアイテムだけを取得するには:

  • First()・たくさんあっても先に掴み、無ければ投げる。
  • FirstOrDefault()- スローせず、最初に返すか、何もない場合はデフォルトを返します。

多くても 1 つしか存在しないようにするには、次のようにします。

  • Single()- エントリが 1 つだけであることを確認し、正確に 1 つでない場合はスローします。
  • SingleOrDefault()-多くても 1 つであることを確認し、存在しない場合はデフォルトを返し、それ以上の場合はスローします。

そのため、お客様のニーズに最も適したものを選択します。あなたの問題文から、私がお勧めするのは、空の辞書を持つことは非常に一般的な結果であるように思われるので、Count(あなたがしているように)最初のものをチェックしてからFirst().

これは、例外のオーバーヘッドを心配する必要がないため (そしてCountO(1) 操作であるため)、オーバーヘッドが大幅に削減されます。

于 2012-09-18T20:30:05.387 に答える
3

正確に 1 つのアイテムの使用を期待している場合Single()

Dictionary<int, string> CandidatePlatypiDict = PlatypusID > 0 ? DuckbillData.GetPlatypusById(PlatypusID) :  DuckbillData.GetCandidatePlatypiFromName(SearchVal);
KeyValuePair<int, String> kvp = CandidatePlatypiDict.Single();
于 2012-09-18T20:30:15.217 に答える
1

Linq使用して使用できますFirstOrDefault

CandidatePlatypiDict.FirstOrDefault();
于 2012-09-18T20:30:34.263 に答える