当前位置: 首页 > 编程语言 > C#

如何获取字典中的键的ReadOnlyCollection分享

时间:2023-04-10 12:18:55 C#

C#学习教程:如何获取字典中键的ReadOnlyCollection如果不将Dictionary.KeyCollectiondict.Keys放入数组然后将该数组公开为ReadOnlyCollection,我该如何做到这一点?我希望ReadOnlyCollection是一个合适的包装器,即。据我所知,要反映底层字典的变化,将集合复制到数组是行不通的(而且看起来效率很低——我实际上并不想要一个新集合,只是为了暴露底层的键集合..).任何想法将不胜感激!编辑:我使用的是C#2.0,因此没有.ToList扩展方法(很容易)可用。如果真要用ReadOnlyCollection,问题是ReadOnlyCollection的构造函数带了一个IList,而Dictionary的KeyCollection只是一个ICollection。因此,如果您想将KeyCollection包装在ReadOnlyCollection中,则必须创建一个适配器(或包装器)类型,实现IList,包装KeyCollection。所以它看起来像:vardictionary=...;varreadonly_keys=newReadOnlyCollection(newCollectionListWrapper(dictionary.Keys));虽然不是很优雅,特别是因为KeyCollection已经是一个只读集合并且您可以简单地将它作为ICollection传递?DrJokepu说可能很难为KeysCollection实现包装器。但是,在这种特殊情况下,我认为实施起来并不困难,因为正如我们所知,这是一个只读包装器。这使我们可以忽略一些否则难以实现的方法。这是Dictionary.KeyCollection的封装器的快速实现:classMyListWrapper:IList{privateDictionary.KeyCollectionkeys;publicMyListWrapper(Dictionary.KeyCollectionkeys){this.keys=keys;}#regionIListMemberspublicintIndexOf(Titem){if(item==null)thrownewArgumentNullException();IEnumeratore=keys.GetEnumerator();诠释我=0;while(e.MoveNext()){如果(e.Current.Equals(item))返回i;我++;}thrownewException("未找到项目!");}publicvoidInsert(intindex,Titem){thrownewNotImplementedException();}publicvoidRemoveAt(intindex){thrownewNotImplementedException();}publicTthis[intindex]{get{IEnumeratore=keys.GetEnumerator();if(indexkeys.Count)thrownewIndexOutOfRangeException();诠释我=0;while(e.MoveNext()&&i!=index){i++;}返回e.Current;}设置{抛出新的NotImplementedException();}}#endregion#regionICollectionMemberspublicvoidAdd(Titem){thrownewNotImplementedException();}publicvoidClear(){thrownewNotImplementedException();}publicboolContains(Titem){returnkeys.Contains(item);}publicvoidCopyTo(T[]array,intarrayIndex){keys.CopyTo(array,arrayIndex);}publicintCount{get{returnkeys.Count;}}publicboolIsReadOnly{get{returntrue;}}publicboolRemove(Titem){thrownewNotImplementedException();}#endregion#regionIEnumerable成员publicIEnumeratorGetEnumerator(){returnkeys.GetEnumerator();}#endregion#regionIEnumerable成员System.Collections.IEnumeratorSystem.Collections.IEnumerable.GetEnumerator(){returnkeys.GetEnumerator();}#endregion}这些方法可能不是这种情况最佳实现:)但它只是为了证明这可以在假设您使用的是C#3.0并且您有:dictionaryd;的情况下完成;然后ReadOnlyCollectionr=newReadOnlyCollection(d.Keys.ToList());您还需要导入System.Linq命名空间。遗憾的是,据我所知,KeyCollection不会公开任何可以让您轻松执行此操作的内容。但是,您可以将ReadOnlyCollection子类化,以便其构造函数接收字典本身并覆盖相应的方法,以便它将字典的项目公开为它们自己的项目。记录一下,在.NET4.6中,KeyCollection实现了IReadOnlyCollection,所以如果你使用那个接口,你仍然可以反映对字典的更改,仍然得到O(1)包含,并且因为接口是协变的,你可以返回IReadOnlyCollection很难看,但是这样做会使得上面是C#学习教程:如何获取字典中键的ReadOnlyCollection的全部内容。=新字典();...ReadOnlyCollectionroc=newReadOnlyCollection((newList((IEnumerable)dict.Keys)));本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: