C#:如何在不将字典公开的情况下浏览字典项?

时间:2012-06-14 07:25:56

标签: c# dictionary

该课程如下:

public static class CacheManager
{
    private static Dictionary<string, object> cacheItems = new Dictionary<string, object>();

    private static ReaderWriterLockSlim locker = new ReaderWriterLockSlim();

    public static Dictionary<string, object> CacheItems
    {
        get
        {
            return cacheItems;
        }
    }
    ...
}

也应该使用ReaderWriterLockSlim锁定器对象。

客户端现在看起来如下:

foreach (KeyValuePair<string, object> dictItem in CacheManager.CacheItems)
{
    ...
}

提前谢谢。

4 个答案:

答案 0 :(得分:6)

如果你只需要迭代内容,那么坦率地说它并没有真正用作字典,但是迭代器块和索引器可能用于隐藏内部对象:

public IEnumerable<KeyValuePair<string, object>> CacheItems
{
    get
    { // we are not exposing the raw dictionary now
        foreach(var item in cacheItems) yield return item;
    }
}
public object this[string key] { get { return cacheItems[key]; } }

答案 1 :(得分:2)

这个属性怎么样:

public static IEnumerable<KeyValuePair<string, object> CacheItems
{
    get
    {
        return cacheItems;
    }
}

Dictionary实现了IEnumerable接口(你的foreach语句已经使用过),但是只将它暴露为IEnumerable,你就可以防止在字典中添加或删除项目。

如果需要通过索引操作符访问字典,则可以非常轻松地实现ReadOnlyDictionary。它看起来像这样:

public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
    private IDictionary<TKey, TValue> _Source;

    public ReadOnlyDictionary(IDictionary<TKey, TValue> source)
    {
        if(source == null)
            throw new ArgumentNullException("source");

        _Source = source;
    }

    // ToDo: Implement all methods of IDictionary and simply forward
    //       anything to the _Source, except the Add, Remove, etc. methods
    //       will directly throw an NotSupportedException.
}

在这种情况下,您还可以将缓存传播为

private static ReadOnlyDictionary<string, object> _CacheReadOnly;
private static Dictionary<string, object> _CacheItems;

public static ctor()
{
    _CacheItems = new Dictionary<string, object>();
    _CacheReadOnly = new ReadOnlyDictionary(_CacheItems);
}

public static IDictionary<string, object> CacheItems
{
    get
    {
        return CacheReadOnly;
    }
}

更新

如果你真的需要阻止强制转换为字典,你也可以使用它:

public static IEnumerable<KeyValuePair<string, object> CacheItems
{
    get
    {
        return cacheItems.Select(x => x);
    }
}

答案 2 :(得分:1)

在过滤的字典上公开一个只读视图的属性?公开允许访问迭代的方法。

究竟是什么问题? “没有将字典公开为公开”,这是模糊不清的,这是不可回答的。

答案 3 :(得分:0)

根据字典的大小,您可以使用MemberwiseClone

您可能还想查看IsReadOnly属性。