我正在尝试将Dictionary作为参数发送到方法。它有效,但它有点乏味。我做了一百万次,如果可能的话,我想做一点点光滑。现在,这就是它的样子:
MyMethod(new Dictionary<string, object> { { string1, value1 }, { string2, value2 } });
我希望看起来更像这样:
MyMethod({ string1, value1 }, { string2, value2 });
这是一个白日梦吗?关于如何做到的任何想法?
答案 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。