Как я могу преобразовать из словаря в SortedDictionary с помощью LINQ в C #? - PullRequest
28 голосов
/ 16 января 2009

У меня есть Dictionary<string, double>, и я хочу преобразовать его в SortedDictionary<double, string>. Как мне сделать это, используя методы расширения LINQ в C # 3.0?

РЕДАКТИРОВАТЬ: Общие угловые скобки не в первоначальном вопросе, когда Марк и Джаред ответили.

Ответы [ 5 ]

47 голосов
/ 16 января 2009

изменить этот ответ был до редактирования; ответ на обновленную проблему см. в этом ответе .

Зачем использовать LINQ? Для этого есть конструктор:

new SortedDictionary<int, string>(existing);

Вы можете добавить a ToSortedDictionary - но я бы не стал беспокоиться ...

8 голосов
/ 16 января 2009

LINQ не требуется. SortedDictionary имеет конструктор для выполнения преобразования.

public SortedDictionary<TKey,TValue> Convert<TKey,TValue>(Dictionary<TKey,TValue> map) {
  return new SortedDictionary<TKey,TValue>(map);
}
5 голосов
/ 16 января 2009

Кажется, что вы просите элегантный способ взять Dictionary<TKey,TValue> и превратить его в SortedDictionary<TValue,TKey> (обратите внимание, что значение Dictionary теперь является ключом SortedDictionary). Я не вижу ответа на этот вопрос, так что вот так.

Вы можете создать метод расширения, который выглядит следующим образом:

static class Extensions
{
    public static Dictionary<TValue, TKey> 
         AsInverted<TKey, TValue>(this Dictionary<TKey, TValue> source)
    {
        var inverted = new Dictionary<TValue, TKey>();

        foreach (KeyValuePair<TKey, TValue> key in source)
            inverted.Add(key.Value, key.Key);

        return inverted;
    }
}

И код вашего приложения будет выглядеть так:

using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var dict = new Dictionary<String, Double>();
        dict.Add("four", 4);
        dict.Add("three", 3);
        dict.Add("two", 2);
        dict.Add("five", 5);
        dict.Add("one", 1);

        var sortedDict = new SortedDictionary<Double, String>(dict.AsInverted());
    }
}
1 голос
/ 16 января 2009

Вам не нужен LINQ, только несколько изящных методов расширения:

public static IDictionary<TKey, TValue> Sort<TKey, TValue>(this IDictionary<TKey, TValue> dictionary)
{
    if(dictionary == null)
    {
        throw new ArgumentNullException("dictionary");
    }

    return new SortedDictionary<TKey, TValue>(dictionary);
}

public static IDictionary<TKey, TValue> Sort<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, IComparer<TKey> comparer)
{
    if(dictionary == null)
    {
        throw new ArgumentNullException("dictionary");
    }

    if(comparer == null)
    {
        throw new ArgumentNullException("comparer");
    }

    return new SortedDictionary<TKey, TValue>(dictionary, comparer);
}

Пример использования:

var dictionary = new Dictionary<int, string>
{
    { 1, "one" },
    { 2, "two" },
    { 0, "zero" }
};

foreach(var pair in dictionary.Sort())
{
    Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
}

// 0: zero
// 1: one
// 2: two
0 голосов
/ 17 января 2009

Инверсия с использованием ToDictionary:

public static IDictionary<TValue, TKey> Invert<TKey, TValue>(this IDictionary<TKey, TValue> dictionary)
{
    if(dictionary == null)
    {
        throw new ArgumentNullException("dictionary");
    }

    return dictionary.ToDictionary(pair => pair.Value, pair => pair.Key);
}

Пример использования:

var dictionary = new Dictionary<string, int>
{
    { "zero", 0 },
    { "one", 1 },
    { "two", 2 }
};

foreach(var pair in dictionary.Invert())
{
    Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
}

// 0: zero
// 1: one
// 2: two

Пример инвертирования и сортировки (см. Мой другой ответ для определения Sort):

var dictionary = new Dictionary<string, int>
{
    { "one", 1 },
    { "two", 2 },
    { "zero", 0 }
};

foreach(var pair in dictionary.Invert().Sort())
{
    Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
}

// 0: zero
// 1: one
// 2: two
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...