KeyedCollection GetKeyForItem和Dictionary无效

时间:2018-04-15 22:47:27

标签: c# keyedcollection

这是我的问题:似乎我不能使用.Dictionary属性或GetKeyForItem方法。是否存在我缺少的使用声明或其他内容?本质上,我想检索我的keyedcollection中每个对象的键列表。我已经找到了另一种方法(在代码中显示),但我只是想知道为什么内置的.Dictionary和.GetKeyForItem不起作用。我想如果我不能访问这些,也许我设置错误了?谢谢您的帮助。

namespace testList
{
    public class MyData //data itself has to contain the key. 
    {
        public int Id;
        public List<string> Data;
    }

    public class MyKeyedCollection : KeyedCollection<int, MyData>
    {

//was initially protected. Changed to public. Still can't access this?
        public override int GetKeyForItem(MyData item) 
        {
            return item.Id;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyData nd = new MyData();
            MyData md = new MyData();

            nd.Id = 2;
            nd.Data = new List<string>();
            nd.Data.Add("Random Item");

            md.Id =1;
            md.Data = new List<string>();
            md.Data.Add("First Item");
            md.Data.Add("Second item");

            KeyedCollection<int, MyData> keyd = new MyKeyedCollection();
            keyd.Add(nd);
            keyd.Add(md);
            // doesn't recognize keyd.GetKeyForItem

//Since the mentioned methods aren't working, my only other solution is this:
/*
            int[] keys = new int[keyd.Count];
            for(int i=0; i<keyd.Count; i++)
            {
                keys[i] = keyd[i].Id;
            }
*/
        }
    }
}

来源:

http://geekswithblogs.net/NewThingsILearned/archive/2010/01/07/using-keyedcollectionlttkey-titemgt.aspx

https://msdn.microsoft.com/en-us/library/ms132438.aspx

2 个答案:

答案 0 :(得分:2)

protected关键字是成员访问修饰符。受保护的成员可在其类和派生类实例中访问。

请参阅documentation了解protected关键字。

由于Class Program不是从KeyedCollection派生的,因此无法访问方法GetKeyForItem

答案 1 :(得分:2)

此类集合通常用于通过了解密钥来实现项目的快速访问时间:检索与给定项目关联的密钥有点奇怪,因为它可能会打开模糊的场景。 实际上,您尝试覆盖的方法具有 protected 修饰符这一事实强调了它不应该从&#34;外部&#34;。

进行访问。

作为一个例子:您可以将同一个对象存储两次但使用不同的密钥,并且您的方法无法知道要选择哪个密钥。

这就是说,根据您的需要,您正在寻找的解决方案可能会有所不同。

无论如何,要回答你的问题: 您的集合的静态类型是KeyedCollection,因此您在编译时没有GetKeyForItem方法的可见性,因为它受到保护。 此外,不允许覆盖C#中方法的访问修饰符,如JPEG Specification所述。

解决方案可能是实现该方法并通过您需要创建的另一个新方法公开其结果,并且可以访问GetKeyForItem,例如:

protected override int GetKeyForItem(MyData item) {
    return item.Id;
}

public int MyGetKeyForItem(MyData item) {
    return GetKeyForItem(item);
}

然后需要按照以下方式初始化您的集合,以便能够访问MyGetKeyForItem方法:

MyKeyedCollection keyd = new MyKeyedCollection();

然后,如果您需要检索集合中定义的所有键,您可以先将其作为IDictionary获取,然后检索所有键:

int keys = keyd.Dictionary.Keys;