优雅的方式从对象列表到具有两个属性的字典

leo*_*ora 27 c# arrays dictionary visual-studio-2005

我好像一遍又一遍地编写这段代码,想看看是否有更好的方法来更一般地做这件事.

我从一个Foo对象列表开始

Foo[] foos = GenerateFoos();
Run Code Online (Sandbox Code Playgroud)

我想创建一个字典,其中键和值都是Foo的属性

例如:

Dictionary<string, string> fooDict = new Dictionary<string, string>():
foreach (Foo foo in foos)
{
    fooDict[foo.Name] = foo.StreetAddress;
}
Run Code Online (Sandbox Code Playgroud)

无论如何都要编写这个代码,因为它看起来像一个基本模板,其中有一个对象数组,一个键属性值属性和一个字典.

有什么建议?

我正在使用VS 2005(C#,2.0)

Mar*_*ell 79

使用LINQ:

var fooDict = foos.ToDictionary(x=>x.Name,x=>x.StreetAddress);
Run Code Online (Sandbox Code Playgroud)

(是的,fooDictDictionary<string, string>)


编辑以显示VS2005中的痛苦:

Dictionary<string, string> fooDict =
    Program.ToDictionary<Foo, string, string>(foos,
        delegate(Foo foo) { return foo.Name; },
        delegate(Foo foo) { return foo.StreetAddress; });
Run Code Online (Sandbox Code Playgroud)

你在哪里(in Program):

public static Dictionary<TKey, TValue> ToDictionary<TSource, TKey, TValue>(
    IEnumerable<TSource> items,
    Converter<TSource, TKey> keySelector,
    Converter<TSource, TValue> valueSelector)
{
    Dictionary<TKey, TValue> result = new Dictionary<TKey, TValue>();
    foreach (TSource item in items)
    {
        result.Add(keySelector(item), valueSelector(item));
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)


Guf*_*ffa 8

如果您使用的是框架3.5,则可以使用ToDictionary扩展名:

Dictionary<string, string> fooDict = foos.ToDictionary(f => f.Name, f => f.StreetAddress);
Run Code Online (Sandbox Code Playgroud)

对于框架2.0,代码非常简单.

您可以通过在创建字典时指定字典的容量来稍微提高性能,以便在填充字典时不必执行任何重新分配:

Dictionary<string, string> fooDict = new Dictionary<string, string>(foos.Count):
Run Code Online (Sandbox Code Playgroud)