简化建筑词典

时间:2012-08-23 20:14:28

标签: c# dictionary refactoring

我正在尝试将Dictionary作为参数发送到方法。它有效,但它有点乏味。我做了一百万次,如果可能的话,我想做一点点光滑。现在,这就是它的样子:

MyMethod(new Dictionary<string, object> { { string1, value1 }, { string2, value2 } });

我希望看起来更像这样:

MyMethod({ string1, value1 }, { string2, value2 });
这是一个白日梦吗?关于如何做到的任何想法?

4 个答案:

答案 0 :(得分:4)

我认为没有办法获得您正在寻找的语法类型。我能想到的最接近,最短的事情是定义类似的东西:

using D = System.Collections.Generic.Dictionary<string, object>;

然后你可以这样做:

MyMethod(new D {{string1, value1},{string2, value2}});

哪个更短,但可能仍然不理想。

答案 1 :(得分:2)

这几乎是一个白日梦。您可以创建一个通用DictionaryBuilder类,其中包含一个非通用类,包含通用DictionaryBuilder.Start方法,因此您可以编写:

MyMethod(DictionaryBuilder.Start(string1, value1).Add(string2, value2).Build());

......但这也不是很好。

要为新对象(而不是嵌入式初始化程序)使用集合初始值设定项,来调用构造函数,这意味着指定类型参数。

答案 2 :(得分:2)

我无法确切地知道你正在寻找什么,但你可以作弊,并使用可变参数列表。你失去了一些类型检查,如果你没有完全正确地调用它,你会得到一个例外,但它不那么冗长:

void MyMethod( params object[] arr ) {
    var d = new Dictionary<string,object>();
    for( int i=0; i<arr.Length; i+=2 ) {
        d.Add( (string)arr[i], arr[i+1] );
    }
}

使用示例:

MyMethod( string1, value1, string2, value2 );

答案 3 :(得分:1)

如果你坚持缩短你的方法输入到极致,我的思路与Ethan Brown一样。这是一个使用params输入字典元素的小程序。

class Program
{
    static void Main(string[] args)
    {
        MyMethod("Key1", 1, "Key2", 2, "Key3", 3);
    }

    static void MyMethod(params object[] alternatingKeysValues)
    {
        var dictionary = AlternatingKeysValuesToDictionary(alternatingKeysValues);
        // etc...
    }

    static Dictionary<string, object> AlternatingKeysValuesToDictionary(params object[] alternatingKeysValues)
    {
        if (alternatingKeysValues.Count() % 2 == 1)
            throw new ArgumentException("AlternatingKeysValues must contain an even number of items.");
        return Enumerable
            .Range(1, alternatingKeysValues.Count() / 2)
            .ToDictionary(
                i => (string)alternatingKeysValues.ElementAt(i * 2 - 2),
                i => alternatingKeysValues.ElementAt(i));
    }
}

那就是说,我认为像Eric这样的回答实际上更好。为非常冗长的Dictionary<object, string>指定一个快捷方式可以让您非常接近理想,而不会牺牲Dictionary内置集合初始化程序提供的清晰度或自然错误检查。

然而,我会采取稍微更明确的措辞:

using Dict = System.Collections.Generic.Dictionary<string, object>;

用法:

MyMethod(new Dict {{string1, value1},{string2, value2}});

更好的是,将Dict替换为实际描述字典所包含内容的内容,例如,如果您的密钥为FruitName且值为Price,则为fruitPrices。