C# 如何在字典中搜索值
在字典中搜索值的最佳方法是什么。 例如,我想搜索修改过的对象,遍历整个集合是唯一的方法吗 c#,.net 2.0C# 如何在字典中搜索值,c#,C#,在字典中搜索值的最佳方法是什么。 例如,我想搜索修改过的对象,遍历整个集合是唯一的方法吗 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
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;
}
}
class RecA
{
公共bool修改{get;set:}
公共字符串txt{get;set;}
}
课堂复习:词典
{
公共bool GetItemByKey(int键,out对象)
{
返回此.TryGetValue(键,输出对象);
}
公共列表getModifiedItems()
{
List li=新列表();
对于(int i=0;iYes)。要么必须检查每个值,要么必须跟踪另一个数据结构中的更改,例如修改对象列表。(可以将其隐藏在专用字典实现中。)是。要么必须检查每个值,要么必须跟踪另一个数据结构中的更改,例如修改对象列表。(可以将其隐藏在专用字典实现中。)是的,字典只能快速查找键。如果要查找值中的任何内容,必须循环整个集合
如果您经常这样做,您可以在集合中放置一个列表,只跟踪修改的项。修改集合时会增加一些开销,因为列表也必须更新,但只获取修改的项会非常快。是的,字典只快速查找键。如果您想查找值中的任何内容,都必须在整个集合中循环
如果你经常这样做,你可以在你的收藏中放一个列表,只跟踪修改过的项目。修改收藏时会增加一点开销,因为列表也必须更新,但是只获取修改过的项目会非常快。考虑到限制(.NET 2.0),你几乎达到了目标。IEnumerable
plusyield return
是一个更好的选择,IMO:
public IEnumerable<Rec_A> getModifiedItems()
{
foreach (Rec_A rec in this.Values)
{
if (rec.modified)
yield return rec;
}
}
public IEnumerable getModifiedItems()
{
foreach(此.Values中的记录)
{
如果(记录修改)
收益率收益率;
}
}
考虑到约束条件(.NET 2.0),您几乎达到了目标。IEnumerable
plus收益率回报率是一个更好的选择,IMO:
public IEnumerable<Rec_A> getModifiedItems()
{
foreach (Rec_A rec in this.Values)
{
if (rec.modified)
yield return rec;
}
}
public IEnumerable getModifiedItems()
{
foreach(此.Values中的记录)
{
如果(记录修改)
收益率收益率;
}
}
搜索整个字典肯定是最简单的方法,尽管foreach
循环会更干净:
foreach (KeyValuePair<int, Rec_A> kvp in d)
{
// Check kvp.Value
}
foreach(d中的KeyValuePair kvp)
{
//检查kvp.Value
}
如果希望查找速度更快,可以在修改对象时将修改的对象添加到单独的列表中。这会降低修改速度,因此这里需要权衡。搜索整个词典肯定是最简单的方法,不过foreach
循环会更干净:
foreach (KeyValuePair<int, Rec_A> kvp in d)
{
// Check kvp.Value
}
foreach(d中的KeyValuePair kvp)
{
//检查kvp.Value
}
如果您想加快查找速度,可以在修改对象时将修改后的对象添加到单独的列表中。但这会降低修改速度,因此这里需要权衡。您的问题的基本答案是肯定的,您必须遍历这些值以查找修改后的对象
现在,这个答案的其余部分将读作一个代码回顾。当我阅读你的代码时,我脑海中响起了太多的警钟,我觉得不得不这么做
1) 首先,您的代码将起到平衡作用。这是因为您正在将字典中的键处理为列表或数组中的索引。您的for
循环从0开始i
,并将其递增为计数(顺便说一句,这是键值对的数目).但是如果我在字典中没有键等于0的值怎么办?基本上你会得到这样的异常:
RecA_Dic myD = new RecA_Dic();
myD.Add(10,new Rec_A());
myD.getModifiedItems(); //throws KeyNotFoundException
现在,如果使用零基索引将值添加到词典
,那么这就引出了一个问题:当列表
可以使用时,为什么要使用词典
2) 你不需要对这个[i]
进行强制转换。因为你告诉字典它将包含Rec\u A
值,它将返回Rec\u A
值。这就是泛型的美妙之处
< P > 3)不需要在<代码> < <代码> >语句中比较<代码>修改>真/ <代码>。当使用<代码> BOOL >变量通常被认为是好的礼仪,不将它们与<代码> > <代码> >或代码> false < /代码>。在另一方面注意,您可能要考虑重命名<代码>修改< /COD> > <代码> ISMO。修改后的
。更好地遵守许多标准命名约定,并使代码更具可读性
4) 尽可能尝试使用foreach
而不是for
。在这种情况下,foreach
实际上可以解决我在1中提到的问题
< P > 5)正如温贝托提到的,您可能需要考虑返回<代码> iQuestaby,并使用<代码>收益返回< /代码>。这将给您延迟执行的好处。
6) 最后,你为什么还要从字典
继承呢?基于你的代码,我想你可以创建一个字典
,让你的方法静态
,并将字典
(或者列表
,如果你真的需要的话)作为一个参数
我希望我的一些建议能对您有所帮助。您的问题的基本答案是肯定的,您必须遍历这些值才能找到修改后的值
现在,这个答案的其余部分将读作一个代码回顾。当我阅读你的代码时,我脑海中响起了太多的警钟,我觉得不得不这么做
<