【问题标题】:How can I access the only KeyValuePair in a dictionary?如何访问字典中唯一的 KeyValuePair?
【发布时间】:2012-09-11 03:45:44
【问题描述】:

我有一个从数据库中填充的字典。

如果只返回一条记录,如何访问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
    // ???
}

【问题讨论】:

  • 为什么不能遍历字典?所以它只会迭代一次。
  • First()FirstOrDefault 是最明智的,但 CandidatePlatypiDict[CandidatePlatypiDict.Keys[0]] 确实有效

标签: c# winforms dictionary key-value


【解决方案1】:

您可以根据需要使用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) 操作)。

【讨论】:

    【解决方案2】:

    你可以使用LinqFirstOrDefault

    CandidatePlatypiDict.FirstOrDefault();
    

    【讨论】:

      【解决方案3】:

      如果您只期待一件商品,请使用 Single()

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

      【讨论】:

        猜你喜欢
        • 2017-10-24
        • 2014-10-07
        • 2021-09-20
        • 1970-01-01
        • 2018-05-09
        • 1970-01-01
        • 1970-01-01
        • 2014-05-20
        • 1970-01-01
        相关资源
        最近更新 更多