C# 如何在字典中搜索值

C# 如何在字典中搜索值,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

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

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;
   }

}
class RecA
{ 
公共bool修改{get;set:}
公共字符串txt{get;set;}
}
课堂复习:词典
{
公共bool GetItemByKey(int键,out对象)
{
返回此.TryGetValue(键,输出对象);
}
公共列表getModifiedItems()
{
List li=新列表();

对于(int i=0;iYes)。要么必须检查每个值,要么必须跟踪另一个数据结构中的更改,例如修改对象列表。(可以将其隐藏在专用字典实现中。)

是。要么必须检查每个值,要么必须跟踪另一个数据结构中的更改,例如修改对象列表。(可以将其隐藏在专用字典实现中。)

是的,字典只能快速查找键。如果要查找值中的任何内容,必须循环整个集合


如果您经常这样做,您可以在集合中放置一个列表,只跟踪修改的项。修改集合时会增加一些开销,因为列表也必须更新,但只获取修改的项会非常快。

是的,字典只快速查找键。如果您想查找值中的任何内容,都必须在整个集合中循环

如果你经常这样做,你可以在你的收藏中放一个列表,只跟踪修改过的项目。修改收藏时会增加一点开销,因为列表也必须更新,但是只获取修改过的项目会非常快。

考虑到限制(.NET 2.0),你几乎达到了目标。
IEnumerable
plus
yield 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) 最后,你为什么还要从
字典
继承呢?基于你的代码,我想你可以创建一个
字典
,让你的
方法
静态
,并将
字典
(或者
列表
,如果你真的需要的话)作为一个参数


我希望我的一些建议能对您有所帮助。

您的问题的基本答案是肯定的,您必须遍历这些值才能找到修改后的值

现在,这个答案的其余部分将读作一个代码回顾。当我阅读你的代码时,我脑海中响起了太多的警钟,我觉得不得不这么做

<