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);

...但如果只有一条记录,我不需要在 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()- 不会抛出,首先返回,如果没有则默认。

为了确保最多存在一个:

  • Single()- 确保只有一个条目,如果不完全是一个则抛出。
  • SingleOrDefault()-最多确保一个,如果没有则返回默认值,如果更多则抛出。

所以我会选择最能满足您需求的一款。从您的问题陈述中,我建议的是,由于似乎有一个空字典是一个非常常见的可能结果,请检查第Count一个(就像您正在做的那样)然后调用First().

这开销要少得多,因为这样您就不必担心异常开销(并且Count是 O(1) 操作)。

于 2012-09-18T20:30:05.387 回答
3

如果您期望只使用一件物品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 回答