8

ArrayのオブジェクトがPersonあり、それをに変換したいと思いますConcurrentDictionaryArrayをに変換するための拡張方法がありDictionaryます。Arrayをに変換するための拡張方法はありますConcurrentDictionaryか?

public class Person
{
    public Person(string name, int age)
    {
        Name =name;
        Age = age;
    }

    public string Name { get; set; }
    public int Age { get; set; }
}

Dictionary<int, Person> PersonDictionary = new Dictionary<int, Person>(); 
Person[] PersonArray = new Person[]
{
    new Person("AAA", 30),
    new Person("BBB", 25),
    new Person("CCC",2),
    new Person("DDD", 1)
};

PersonDictionary = PersonArray.ToDictionary(person => person.Age);

ArrayConcurrentDictionary?に変換するための同様の拡張メソッド/ラムダ式

4

3 に答える 3

23

確かに、:を受け入れるコンストラクターを使用してIEnumerable<KeyValuePair<int,Person>>ください

var personDictionary = new ConcurrentDictionary<int, Person>
                       (PersonArray.ToDictionary(person => person.Age));

varタイプをに推測しConcurrentDictionary<int,Person>ます。

Waspが提案したように、拡張メソッドを作成する場合は、より流暢な構文を提供する次のバージョンを使用することをお勧めします。

public static ConcurrentDictionary<TKey, TValue> ToConcurrentDictionary<TKey, TValue> 
(this IEnumerable<TValue> source, Func<TValue, TKey> valueSelector)
{
    return new ConcurrentDictionary<TKey, TValue>
               (source.ToDictionary(valueSelector));
}

使用法はに似ておりToDictionary、一貫した感触を作成します。

var dict = PersonArray.ToConcurrentDictionary(person => person.Age);
于 2012-09-12T21:15:03.907 に答える
12

たとえば、次のように、独自の拡張メソッドを非常に簡単に作成できます。

public static class DictionaryExtensions
{
    public static ConcurrentDictionary<TKey, TValue> ToConcurrentDictionary<TKey, TValue>(
        this IEnumerable<KeyValuePair<TKey, TValue>> source)
    {
        return new ConcurrentDictionary<TKey, TValue>(source);
    }

    public static ConcurrentDictionary<TKey, TValue> ToConcurrentDictionary<TKey, TValue>(
        this IEnumerable<TValue> source, Func<TValue, TKey> keySelector)
    {
        return new ConcurrentDictionary<TKey, TValue>(
            from v in source 
            select new KeyValuePair<TKey, TValue>(keySelector(v), v));
    }

    public static ConcurrentDictionary<TKey, TElement> ToConcurrentDictionary<TKey, TValue, TElement>(
        this IEnumerable<TValue> source, Func<TValue, TKey> keySelector, Func<TValue, TElement> elementSelector)
    {            
        return new ConcurrentDictionary<TKey, TElement>(
            from v in source
            select new KeyValuePair<TKey, TElement>(keySelector(v), elementSelector(v)));
    }
}
于 2012-09-12T21:23:26.830 に答える
3

取るコンストラクタがありますIEnumerable<KeyValuePair<TKey,TValue>>

IDictionary<int,Person> concurrentPersonDictionary = 
  new ConcurrentDictionary<int,Person>(PersonArray.ToDictionary(person => person.Age));
于 2012-09-12T21:14:57.623 に答える