如何在C#中使用LINQ从Dictionary转换为SortedDictionary?

时间:2009-01-16 19:51:10

标签: c# linq dictionary

我有Dictionary<string, double>,我想将其转换为SortedDictionary<double, string>。如何在C#3.0中使用LINQ扩展方法执行此操作?

编辑:当Marc和Jared回答时,通用尖括号不在原始问题中。

5 个答案:

答案 0 :(得分:46)

编辑此答案在编辑之前;要获得更新问题的答案,请参阅this reply

为什么要使用LINQ?有一个构造函数:

new SortedDictionary<int, string>(existing);

你可以添加一个ToSortedDictionary - 但我不会打扰......

答案 1 :(得分:8)

不需要LINQ。 SortedDictionary有一个构造函数来进行转换。

public SortedDictionary<TKey,TValue> Convert<TKey,TValue>(Dictionary<TKey,TValue> map) {
  return new SortedDictionary<TKey,TValue>(map);
}

答案 2 :(得分:5)

好像你要求一种优雅的方法来取一个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}}

答案 3 :(得分:1)

你不需要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

答案 4 :(得分:0)

使用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