KeyedCollection 与 KeyNotFoundException

(来自:http://blog.csdn.net/ahbian/article/details/4286076)

实现 KeyedCollection <int, object> 时,容易遇到 KeyNotFoundException。

原来是一个书写习惯引起的。

有时错误,还真不是一眼就能看出来的。

 

 

[c-sharp]  view plain copy
  1. class KV  
  2.     {  
  3.         private int id;  
  4.         private string text;  
  5.   
  6.         internal KVCollection OwnerCollection;  
  7.   
  8.         public int Id  
  9.         {  
  10.             get {}  
  11.             set {}  
  12.         }  
  13.   
  14.         public string Text  
  15.         {  
  16.             get {}  
  17.             set {}  
  18.         }  
  19.     }  
  20.   
  21.   
  22.     class KVCollection : KeyedCollection<int, KV>  
  23.     {  
  24.         protected override int GetKeyForItem ( KV item )  
  25.         {  
  26.             return item.Id;  
  27.         }  
  28.   
  29.         protected override void SetItem ( int index, KV newItem )  
  30.         {  
  31.             if (newItem.OwnerCollection != null)  
  32.                 throw new ArgumentException("The item already belongs to a collection.");  
  33.   
  34.             // 此处会犯一个习惯性错误,但仅当键的类型恰好为 int 时,才会成为错误。  
  35.             // 我们通常会这样写:  
  36.             //         KV replaced = this[index];  
  37.             // 如果键类型不 int,则按序号访问集合中的值,这是符合意图的。  
  38.             // 但如果键类型为 int 时,则只能按键访问了,此时通常会引发 KeyNotFoundException 。  
  39.             // 若想安全地按序号访问集合中的值,应该坚持使用:  
  40.             KV replaced = this.Items[index];  
  41.   
  42.             base.SetItem(index, newItem);  
  43.   
  44.             newItem.OwnerCollection = this;  
  45.             replaced.OwnerCollection = null;  
  46.         }  
  47.   
  48.         protected override void RemoveItem ( int index )  
  49.         {  
  50.             // 此处会犯一个习惯性错误,但仅当键的类型恰好为 int 时,才会成为错误。  
  51.             // 我们通常会这样写:  
  52.             //         KV removedItem = this[index];  
  53.             // 如果键类型不 int,则按序号访问集合中的值,这是符合意图的。  
  54.             // 但如果键类型为 int 时,则只能按键访问了,此时通常会引发 KeyNotFoundException 。  
  55.             // 若想安全地按序号访问集合中的值,应该坚持使用:  
  56.               
  57.             KV removedItem = this.Items[index];  
  58.               
  59.             base.RemoveItem(index);  
  60.   
  61.             removedItem.OwnerCollection = null;  
  62.   
  63.             OnListChanged(new System.ComponentModel.ListChangedEventArgs(System.ComponentModel.ListChangedType.ItemDeleted, index));  
  64.         }  
  65.               
  66.     }  
 

你可能感兴趣的:(KeyedCollection 与 KeyNotFoundException)