我在接受采访时被问到以下问题。如何按键排序字典,按数组列表中的顺序排序。
例如,我有一个字典如下
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");
如何按照数组列表中的顺序对字典进行排序?
答案 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);