如何反转字典数组中的索引?

时间:2015-08-13 13:23:25

标签: c# arrays list dictionary indexing

我的数组字典键值对与此类似

[0] 
key : x
value : 1
[1] 
key : y
value : 2
[2] 
key : z
value : 3

但是我需要反转字典的索引。我需要将上面的字典转换为:

[0] 
key : z
value : 3
[1]
key : y
value : 2
[2] 
key : x
value : 1

我尝试了Reverse()函数。但它没有用。我不知道如何实现这一目标。任何人都可以帮我这个吗?

我怎样才能做到这一点?

6 个答案:

答案 0 :(得分:5)

您不应该假设订购词典。他们不是。

如果您想要一个有序的数组,您应该使用SortedDictionary。如果您愿意,也可以在那里撤销订单。您应该使用自定义比较器(从here更改):

class DescendedStringComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        int ascendingResult = Comparer<string>.Default.Compare(x, y);

        // turn the result around
        return 0 - ascendingResult;
    }
}

//

SortedDictionary<string, string> test
     = new SortedDictionary<string, string>(new DescendedDateComparer());

例如,您可以使用foreach对其进行迭代。结果将按降序排列。

答案 1 :(得分:2)

函数Enumerable.Reverse()返回一个IEnumerable而不是一个数组。您是否忘记将反转序列设为数组?以下对我有用:

class Program
{
    static void Main(string[] args)
    {
        var dict = new Dictionary<string, int>();
        dict.Add("x", 1);
        dict.Add("y", 2);
        dict.Add("z", 3);
        var reversed = dict.ToArray().Reverse();
        var reversedArray = reversed.ToArray();
        Console.ReadKey();
    }
}

答案 2 :(得分:1)

我尝试了reverse方法,它有效。请看下面的图片。我使用VS 2013,.Net 4.5

enter image description here

生成的输出

enter image description here

答案 3 :(得分:0)

您应该使用SortedDictionary并在构造上传递密钥

public sealed class CompareReverse<T> : IComparer<T>
{
    private readonly IComparer<T> original;

    public CompareReverse(IComparer<T> original)
    {

       this.original = original;
    }

   public int Compare(T left, T right)
   {
       return original.Compare(right, left);
   }
}

并在您的主要电话中

 var mydictionary = new SortedDictionary<int, string>(
   new CompareReverse<int>(Comparer<int>.Default));

例如: -

  var mydictionary = new SortedDictionary<int, string>(
   new CompareReverse<int>(Comparer<int>.Default));
  dictionary.add(1, "1");
  dictionary.add(2, "2");
  dictionary.add(3, "3");
  dictionary.add(4, "4");

答案 4 :(得分:0)

SortedDictionary按键排序,而不是按值排序。

这是一种颠倒词典中值的顺序的简洁方法:

List<KeyValuePair<string, string>> srcList = aDictionary.ToList();

srcList.Sort(
    delegate(KeyValuePair<string, string> firstPair,
    KeyValuePair<string, string> nextPair)
    {
        return firstPair.Value.CompareTo(nextPair.Value);
    }
);

Dictionary<string, string> outputDictionary = new Dictionary<string, string>();
int listCount = srcList.Count;
for(int i = 0; i < listCount; i++) {
    int valueIndex = i + 1;
    outputDictionary.Add(srcList[i].Key, srcList[valueIndex]);
}

如果您想要输出的是KeyValuePairs的List而不是Dictionary,您可以用我的代码替换最后6行代码:

List<KeyValuePair<string, string>> destList = new List<KeyValuePair<string, string>>();
int listCount = srcList.Count;
for(int i = 0; i < listCount; i++) {
    int valueIndex = i + 1;
    destList.Add(new KeyValuePair<string, string>(srcList[i].Key, srcList[valueIndex]));
}

答案 5 :(得分:0)

You can do this :

for (var i = dictionary.Count - 1; i >= 0; i--)
     dictionary.Values.ElementAt(i), dictionary.Keys.ElementAt(i);

EDIT : Go here -> how to iterate a dictionary<string,string> in reverse order(from last to first) in C#?