C# 按键排序的c哈希表

C# 按键排序的c哈希表,c#,sorting,hashtable,jquery-ui-sortable,C#,Sorting,Hashtable,Jquery Ui Sortable,我有一个哈希表,其中键是字母,值是数字。 如何根据键对哈希表进行排序 ExchangeA, 200 ExchangeV, 100 ExchangeC, 200 像这样 ExchangeA, 200 ExchangeC, 200 ExchangeV, 100 您可以为此使用,它将为您按键进行排序。在您的情况下,SortedDictionary可以工作: SortedDictionary<string, int> dict = new SortedDictionary<stri

我有一个哈希表,其中键是字母,值是数字。 如何根据键对哈希表进行排序

ExchangeA, 200
ExchangeV, 100
ExchangeC, 200
像这样

ExchangeA, 200
ExchangeC, 200
ExchangeV, 100
您可以为此使用,它将为您按键进行排序。在您的情况下,SortedDictionary可以工作:

SortedDictionary<string, int> dict = new SortedDictionary<string, int>();
dict.Add("Exchange C", 200);
dict.Add("Exchange A", 200);
dict.Add("Exchange V", 100);

foreach (var kvp in dict)
{
    Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
}

使用列表而不是哈希或将哈希转换为字典,然后执行以下操作:

var dictionary = new Dictionary<string, int>();
var l = dictionary.Keys.ToList();
l.Sort();
foreach (var key in l)
{
    Console.WriteLine(dictionary[key]);
}

由于哈希表的性质,您无法按就地键对它们进行排序:它们根据哈希代码(哈希表无法控制的值)将它们的键组织到存储桶中。但是,您可以按照自己喜欢的顺序读取键值对。以下是如何使用LINQ进行此操作:

IDictionary<string, int> d = ...; // your hash table
var ordered = d.OrderBy(p => p.Key).ToList();
foreach (var p in ordered) {
    Console.WriteLine("Key: {0} Value: {1}", p.Key, p.Value);
}
使用Linq是一种易于使用的系统。Linq:


返回KeyValuePair列表。

我发现对哈希表进行排序的最简单方法是:

var hash = new Hashtable();
var orderedKeys = hash.Keys.Cast<string>().OrderBy(c => c); // supposing you're using string keys
var allKvp = from x in orderedKeys select new{ key = x, value = hash[x] };
但是,我并没有对原始哈希表进行排序,只是按顺序读取其值


与其他回复一样,如果您需要以排序方式存储数据,最好使用SortedDictionary,我使用列表存储哈希表的键并对其进行排序,然后使用此排序列表显示哈希表。这是我的密码:


哈希表是一种固有的无序数据结构。你想干什么?可以创建键/值对的排序列表,这会满足您的需要吗?有几个答案建议使用linq的Enumerable.OrderBy扩展方法。值得一提的是,哈希表和字典可以有自定义的相等比较器;如果您依赖此功能,则可能需要使用接受自定义IComparer实例的OrderBy重载,为了提供与编译哈希表或字典时使用的相等关系兼容的排序。我想说的是,您希望使用SortedList或SortedDictionary值得注意的是,SortedDictionary是通过二进制搜索树在内部实现的,并且具有Olg n检索,而不是哈希表的预期O1检索。根据OP的需要,他可能希望这样做,或者他可能希望像在其他回答中那样做OrderBy-这是一个很好的观点-只有在必须经常/始终按顺序按键检索并且键查找时间不关键的情况下,才值得使用SortedDictionary,但肯定比O1@GabeMoothartSortedDictionary还有另一个优点:它不使用数组,而Dictionary使用数组。如果您有大量的对象,并且遇到了大对象堆碎片问题,SortedDictionary是一个快速的解决方案,可以让您的数据远离大对象堆。
var sortedList = (from kv in MyDictionary select kv order by kv.Key).ToList<KeyValuePair<string, int>>();
var hash = new Hashtable();
var orderedKeys = hash.Keys.Cast<string>().OrderBy(c => c); // supposing you're using string keys
var allKvp = from x in orderedKeys select new{ key = x, value = hash[x] };
        List<string> lst = new List<string>();
        foreach (var key2 in ht.Keys)
        {
            lst.Add(key2.ToString());
        }
        lst.Sort();
        foreach (var item in lst)
        {
            Console.WriteLine(string.Format("{0},{1}", item, ht[item.ToString()]));
        }