【问题标题】:Check key / value pair in List检查 List 中的键/值对
【发布时间】:2026-01-11 07:10:01
【问题描述】:

我已将列表声明为

 List<KeyValuePair<string, Int64>> KPList = new List<KeyValuePair<string, long>>(); 

我需要检查键和值的组合是否已经存在。我不能使用字典,因为我需要键和值的唯一组合,以防一个键有多个值但作为一对

if(!KPList.Any(p=> p.Key ==keyp && p.Value == valuep))

这有什么问题?

【问题讨论】:

  • 是什么让你觉得有些不对劲?如果您至少使用 .Net 3.5 (iirc),则可以使用 Tuple&lt;string,long&gt; 而不是 KeyValuePair,但除此之外,似乎没问题 - 假设您可以使用 O(n) 查找。
  • 是的,你的代码没问题!它给出了什么错误?你能提供样本值和预期输出吗?
  • 唯一的问题可能是 == 周围的空格不匹配 :) 。不太确定你在找什么...
  • 谢谢你 Blorgbeard。 Tuple 作为字典键是否允许添加唯一的字符串组合,长作为键?
  • 允许重复组合键值对

标签: c# list keyvaluepair


【解决方案1】:

您也可以使用 HashSet,它没有值,但可以根据需要工作。

HashSet< Tuple<string, long> > KPSet = new HashSet< Tuple<string, long> >(); 
...
if(KPSet.Contains(p))
{
    ...
}

【讨论】:

  • 这里的 'p' 是键和值的唯一组合,或者它仅适用于唯一键
  • 在这种情况下,键是字符串和 Int64 的组合。因此对 {64, "abc"}, {64, "def"}, {22, "abc"} 将被视为不同。
  • 实际上应该是这样 :-) {"abc",64}, {"abc","22"},{"xyz",64},{"xyz",22} -可以吗?
  • 是的,它们都是不同的键。
  • @glenebob *.com/questions/8952003/… 正如问题中的回答,HashSet 使用 both GetHashCode() key.Equals() 进行比较。
【解决方案2】:

为了易于使用和获得最佳性能,我建议使用 Dictionary 和 HashSet 的组合:

var KPDict = new Dictionary<string, HashSet<long>>();

然后它将为您提供 O(1)+O(1) 的查找复杂度和简单的值检查:

if (KPDict.ContainsKey(keyp) && KPDict[keyp].Contains(valuep)) {
    //do some actions
}
else{
    //some logic in case keyp, valuep pair not found in KPDict
}

【讨论】:

  • 字典没有排序,无法在特定索引处插入数据等 - 不好的解决方案
  • @PernerOl 有什么不好的解决方案?
  • 用户要求使用键值对检查列表中的键/值。正如已经提到的,字典不是列表的合适替代品,因为它错过了一些东西,比如排序(你需要 foreach 循环或 lambdas),或者在特定索引处插入。正如您不知道的那样,该列表还将用于什么,说“改用字典”是不合逻辑的 - 用户将有他选择列表而不是字典的原因。如果他想知道哪种数据类型的性能最好,他可能会要求,你不觉得吗? ;)
  • @PernerOl 从问题中,“我不能使用字典,因为我需要键和值的唯一组合..”,这表明 OP 使用 Dictionary 没有问题,除此之外它不允许具有相同键的多个值。你假设你的 cmets 中有很多你不知道的东西。
最近更新 更多