2

我正在尝试将 Dictionary 作为参数发送给方法。它有效,但它变得有点乏味。我做了一百万次,如果可能的话,我想做得更漂亮一点。现在,它是这样的:

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

我想让它看起来更像这样:

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

这是白日梦吗?关于如何做到这一点的任何想法?

4

4 回答 4

4

我认为没有任何方法可以获得您正在寻找的语法类型。我能想到的最接近和最短的事情是定义如下:

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

然后你可以这样做:

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

这有点短,但可能仍然不理想。

于 2012-08-23T20:24:41.323 回答
2

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

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

...但这也不是很好。

要将集合初始化器用于新对象(而不是嵌入式初始化器),您必须调用构造函数,这意味着指定类型参数。

于 2012-08-23T20:20:51.273 回答
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 );
于 2012-08-23T20:22:53.237 回答
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为实际描述您的字典包含的内容,例如,fruitPrices 如果您的键是FruitName并且您的值是Price

于 2012-08-23T20:38:55.367 回答