按照Arraylist中的顺序按键排序字典

时间:2014-04-23 21:45:46

标签: c# dictionary arraylist

我在接受采访时被问到以下问题。如何按键排序字典,按数组列表中的顺序排序。

例如,我有一个字典如下

Dictionary<string, string> stringDict = new Dictionary<string, string>();

stringDict.Add("1", "One");
stringDict.Add("7", "Seven");
stringDict.Add("6", "Six");
stringDict.Add("2", "Two");
stringDict.Add("3", "Three");
stringDict.Add("5", "Five");
stringDict.Add("4", "Four");

数组列表如下

ArrayList stringArList = new ArrayList();

stringArList.Add("1");
stringArList.Add("2");
stringArList.Add("3");
stringArList.Add("5");
stringArList.Add("6");
stringArList.Add("7");
stringArList.Add("4");

如何按照数组列表中的顺序对字典进行排序?

5 个答案:

答案 0 :(得分:3)

你不能对词典本身进行排序,但你可以提取键值对作为列表并排序那些

IEnumerable<KeyValuePair<string, string>> pairs = 
    stringDict.OrderBy(kvp => stringArList.IndexOf(kvp.Key));

但是没有办法以任何特定顺序“遍历”字典项目。

您可以创建SortedDictionary并提供IComparer<string>

var d = new SortedDictionary<string, string>(stringDict, 
                                        new PositionComparer(stringArList));

Comparer实施为:

public class PositionComparer : IComparer<string>
{
   private ArrayList Keys {get; set;}

   public PositionComparer(ArrayList keys)
   {
       Keys = keys;
   }

   public int Compare(string s1, string s2)
   {
       return Keys.IndexOf(s1).CompareTo(Keys.IndexOf(s2));
   }
}

答案 1 :(得分:2)

这将生成按要求排序的值列表。

var sortedValues = stringDict.OrderBy(pair => stringArList.IndexOf(pair.Key))
                             .Select(pair => pair.Value)
                             .ToList();

答案 2 :(得分:0)

如前所述,在这个问题中,C#Dictionary无法排序。这是实施所固有的。正如您可以阅读here,字典是使用Hashtable实现的。这意味着这些物品没有任何订购。你不能说“给我这本词典的第一个元素”。根本没有第一,第二或最后一个元素。关于字典中元素,你唯一可以说的是它有一个唯一的标识符,用于确定它在字典中的位置(在哈希函数的帮助下)。

例如,当您在array中有一个元素时,您可以说“此元素是下一个元素”或“此元素是前一个元素”。数组中的每个元素都有前一个和下一个。这不适用于字典。

当您将项目插入字典时,它将根据键生成一个哈希值(一个相当唯一的数字)。例如,由名称组成的键的非常简单(和坏)散列将获取在名称中呈现为其ASCII值的每个字符的总和,然后将它们一起添加。结果是一个数字,比如5,然后我们将在位置5的商店(例如数组)中插入值。但是,如果位置5是另一个值,恰好具有相同的哈希结果,则您有一个{ {1}}。你如何解决这些问题,以及你如何避免这些问题是哈希表的全部内容。有关详细信息,请参阅Wiki。

当您使用密钥collision请求您的值时,它会哈希该值并在该位置查找。

哈希表并不像我刚才解释的那么简单,它也有很多。您可以在Wiki上了解更多信息。

所以“排序这本词典”的答案绝对是“不能做的”。但是,您可以将其转换为可排序的数据结构,如列表或其他任何内容,然后对其进行排序。

答案 3 :(得分:0)

我回答了以下答案。

  var list = from arElement in stringArList.ToArray().ToList()
                   join dict in stringDict on arElement equals dict.Key 
                   select dict ;

但面试官似乎并没有留下深刻的印象。

答案 4 :(得分:0)

original_dic.OrderBy返回IOrderedEnumerable,您将其转换为新词典。

var ordered_dic = original_dic.OrderBy(x => x.Key).ToDictionary(x=> x.Key, x=> x.Value);