在字典中搜索值的最佳方式是什么?例如,我想搜索修改过的对象,遍历整个集合是唯一的方法吗?
c#、.net 2.0
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;
}
}发布于 2010-06-09 04:56:26
你的问题的基本答案是肯定的,你必须遍历这些值来找到修改过的值。
现在,这个答案的其余部分将读起来像是代码审查。当我读到你的代码时,我的脑海中响起了许多警告的铃声,我觉得有必要这么做。
1)首先,你的代码可以正常工作。这是因为您将Dictionary中的键视为List或Array中的索引。您的for循环从0开始i,并将其递增到Count (顺便说一下,这是KeyValuePair的数量)。但是,如果我在Dictionary中没有键等于0的值,该怎么办?基本上,对于这样的事情,你会得到一个异常:
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语句中比较modified和true。在使用bool变量时,通常认为不要将它们与true或false进行比较是一种良好的礼仪。另外,您可能需要考虑将modified重命名为IsModified。这更好地遵循了许多标准命名约定,并使代码更具可读性。
4)尽可能使用foreach而不是for。在这种情况下,foreach实际上可以解决我在1中提到的问题。
5)正如Humberto提到的,你可能想要考虑返回IEnumerable并使用yield return。这为您提供了延迟执行的好处。
6)最后,你为什么还要继承Dictionary?根据您的代码,我猜您可以只创建一个Dictionary,将您的getModified方法设置为static,并使其接受Dictionary (或者List,如果这是您真正需要的全部)作为参数。
我希望我的一些建议能帮助你解决问题。
https://stackoverflow.com/questions/3000727
复制相似问题