我的数组字典键值对与此类似
[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()函数。但它没有用。我不知道如何实现这一目标。任何人都可以帮我这个吗?
我怎样才能做到这一点?
答案 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)
答案 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#?