首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在字典中搜索值

如何在字典中搜索值
EN

Stack Overflow用户
提问于 2010-06-09 03:48:56
回答 6查看 324关注 0票数 1

在字典中搜索值的最佳方式是什么?例如,我想搜索修改过的对象,遍历整个集合是唯一的方法吗?

c#、.net 2.0

代码语言:javascript
运行
复制
class RecA
 { 
 public bool modified {get;set:}
 public string txt {get;set;}
 }

class RecA_Dic : Dictionary<int,Rec_A>
{

   public bool GetItemByKey(int key,out obj)
   {
    return   this.TryGetValue(key, out obj);
    }

   public List<Rec_A> getModifiedItems()
   {
     List<Rec_A> li = new List<Rec_A>();
     for(int i=0;i<this.count;i++)
      if (((Rec_A)this[i]).modified == true)
       li.Add((Rec_A)this[i]);
     return li;
   }

}
EN

Stack Overflow用户

发布于 2010-06-09 04:56:26

你的问题的基本答案是肯定的,你必须遍历这些值来找到修改过的值。

现在,这个答案的其余部分将读起来像是代码审查。当我读到你的代码时,我的脑海中响起了许多警告的铃声,我觉得有必要这么做。

1)首先,你的代码可以正常工作。这是因为您将Dictionary中的键视为ListArray中的索引。您的for循环从0开始i,并将其递增到Count (顺便说一下,这是KeyValuePair的数量)。但是,如果我在Dictionary中没有键等于0的值,该怎么办?基本上,对于这样的事情,你会得到一个异常:

代码语言:javascript
运行
复制
RecA_Dic myD = new RecA_Dic();
myD.Add(10,new Rec_A());
myD.getModifiedItems(); //throws KeyNotFoundException

现在,如果您使用从零开始的索引将值添加到Dictionary中,那么这就回避了一个问题:当List可以使用时,为什么还要使用Dictionary呢?

2)你不需要在this[i]上进行强制转换。因为您告诉Dictionary它将包含Rec_A值,所以它将以Rec_A的形式返回值。这就是泛型的美妙之处。

3)您不需要在if语句中比较modifiedtrue。在使用bool变量时,通常认为不要将它们与truefalse进行比较是一种良好的礼仪。另外,您可能需要考虑将modified重命名为IsModified。这更好地遵循了许多标准命名约定,并使代码更具可读性。

4)尽可能使用foreach而不是for。在这种情况下,foreach实际上可以解决我在1中提到的问题。

5)正如Humberto提到的,你可能想要考虑返回IEnumerable并使用yield return。这为您提供了延迟执行的好处。

6)最后,你为什么还要继承Dictionary?根据您的代码,我猜您可以只创建一个Dictionary,将您的getModified方法设置为static,并使其接受Dictionary (或者List,如果这是您真正需要的全部)作为参数。

我希望我的一些建议能帮助你解决问题。

票数 1
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3000727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档