通用字典比较

时间:2014-09-15 14:33:41

标签: c# generics

我有一个问题,我似乎无法绕过头脑。我正在创建一个类来保存具有泛型类型的项的字典。如果索引类型是字符串,则需要强制使用此字典为InvariantCultureIgnoreCase

例如:

public class Cache<TIndex, TItem>
{
    protected IDictionary<TIndex, TItem> _cache { get; set; }

    public Cache()
    {
        this._cache = new Dictionary<TIndex, TItem>();
    }

    public bool Exists(TIndex index)
    {
        if (!_cache.ContainsKey(index))
        {
            //....do other stuff here
            this._cache.Add(databaseResult.Key, databaseResult.Value);
            return false;
        }
        return true;
    }
} 

所以第一个问题是处理具有不同大小写的字符串;我通过强制数据为大写来解决这个问题。但是,现在我发现有些字符是特定于文化的,因此如果没有不变的文化切换,ContainsKey将返回false。

我尝试过创建一个新的IEqualityComparer,但永远不会被解雇。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

请尝试以下方法:

public Cache()
{
    if (typeof(TIndex) == typeof(string))
    {
        this._cache = new Dictionary<TIndex, TItem>((IEqualityComparer<TIndex>)StringComparer.InvariantCultureIgnoreCase);
    }
    else
    {
        this._cache = new Dictionary<TIndex, TItem>();
    }
}

或(使用三元运算符):

public Cache()
{
    this._cache = typeof(TIndex) == typeof(string)
                ? new Dictionary<TIndex, TItem>((IEqualityComparer<TIndex>)StringComparer.InvariantCultureIgnoreCase)
                : new Dictionary<TIndex, TItem>();
}

或(非常简短,正如@Rawling所建议的那样):

public Cache()
{
    this._cache = new Dictionary<TIndex, TItem>(StringComparer.InvariantCultureIgnoreCase as IEqualityComparer<TIndex>);
}

答案 1 :(得分:1)

这是我认为你要求的全功能版本(我必须添加一个Set功能,否则它基于你自己的代码)。正如if / Console.WriteLine检查显示的那样,忽略大小写。如果这不是您正在寻找的内容,请进一步澄清您的问题。

class Program
{
    static void Main(string[] args)
    {

        Cache<string, string> stringCache = new Cache<string, string>();

        stringCache.Set("A String Index", "A String Item");

        if (stringCache.Exists("A String Index"))
            Console.WriteLine("Title Case exists");

        if (stringCache.Exists("A STRING INDEX"))
            Console.WriteLine("All Caps Exists");

        if (stringCache.Exists("a string index"))
            Console.WriteLine("All Lowercase Exists");
    }
}

class Cache<TIndex, TItem>
{
    private IDictionary<TIndex, TItem> _cache { get; set; }

    public Cache()
    {
        if (typeof(TIndex) == typeof(string))
        {
            _cache = new Dictionary<TIndex, TItem>((IEqualityComparer<TIndex>)StringComparer.InvariantCultureIgnoreCase);
        }
        else
        {
            _cache = new Dictionary<TIndex, TItem>();
        }
    }

    public void Set(TIndex index, TItem item)
    {
        _cache[index] = item;
    }

    public bool Exists(TIndex index)
    {
        if (!_cache.ContainsKey(index))
        {
            return false;
        }
        return true;
    }

}