按ASC顺序按值对哈希表进行排序



我在紧凑框架3.5 中工作

myfile.cs

public class Cases : IEnumerable
{
    private Hashtable cases = new Hashtable();   // hashtable initilized
    IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
            return cases.GetEnumerator();
    }
     public bool Add(string caseCode, string scanTime)
     {
        Reading reading = new Reading(caseCode, scanTime);
        cases.Add(caseCode, reading);   
        //some other logic          
     }
}

我已经将哈希表初始化为case。我正在添加扫描条形码的情况可变。目前它没有任何秩序。我需要按升序订购扫描的条形码。如何做到这一点。

更新:

例如,我添加了以下项目,

  Cases a = new Cases();
        a.Add("11115", "2014-09-11T01:55:25.0000000-07:00");
        a.Add("11111", "2014-09-11T01:55:40.0000000-07:00");
        a.Add("11112", "2014-09-11T01:55:45.0000000-07:00");
        a.Add("11110", "2014-09-11T01:55:56.0000000-07:00");
        a.Add("11113", "2014-09-11T01:56:10.0000000-07:00");
        a.Add("11111", "2014-09-11T01:56:17.0000000-07:00");

我希望数据按列表中的顺序打印。这里我们给出的关键是时间,这里的时间默认为升序。但在打印过程中,它是这样打印的,

[11110,StackOverflow.Reading] 
[11111,StackOverflow.Reading] 
[11111,StackOverflow.Reading] 
[11112,StackOverflow.Reading] 
[11113,StackOverflow.Reading] 
[11115,StackOverflow.Reading] 

我希望这个像这样打印,

[11115,StackOverflow.Reading] 
[11111,StackOverflow.Reading] 
[11112,StackOverflow.Reading] 
[11110,StackOverflow.Reading] 
[11113,StackOverflow.Reading] 
[11111,StackOverflow.Reading]

使用哈希表随机打印上述内容,而不是按任何顺序打印。但是,SortedList是按升序打印的。你能告诉我如何按同样的顺序打印列表中的数据吗。

使用Dictionary

下面的程序通过Reading.scanTime实现您想要的行为排序。

using System.Collections;
using System.Collections.Generic;
using System;
using System.Linq;
namespace StackOverflow
{
    class Program
    {
        static void Main(string[] args)
        {
            Cases a = new Cases();
            a.Add("keyA", "01:00");
            a.Add("keyB", "11:30");
            a.Add("keyC", "06:20");
            foreach (KeyValuePair<string, Reading> x in a)
            {
                Console.WriteLine("{0}: {1}", x.Key, x.Value);
            }
        }
    }
    public class Cases : IEnumerable
    {
        private Dictionary<string, Reading> cases =
            new Dictionary<string, Reading>();
        IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return cases.GetEnumerator();
        }
        public bool Add(string caseCode, string scanTime)
        {
            Reading reading = new Reading(caseCode, scanTime);
            cases.Add(caseCode, reading);
            cases = cases.Values.OrderBy(v => v).ToDictionary(r => r.caseCode);
            return true;         
        }
    }
    public class Reading : IComparable
    {
        public string caseCode; // don't mind public fields and bad naming, it's just an example ;)
        public string scanTime;
        public Reading(string a, string b)
        {
            this.caseCode = a;
            this.scanTime = b;
        }
        public int CompareTo(object obj)
        {
            Reading other = obj as Reading;
            if (other == null)
            {
                return -1;
            }
            return this.scanTime.CompareTo(other.scanTime);
        }
        public override string ToString()
        {
            return caseCode + " scanned at " + scanTime;
        }
    }
}

HashTable中的项本质上是无序的。您不能订购它们。如果要按特定顺序排列项目,则需要使用可订购集合。您可以将集合中的项按顺序排列,然后将它们放在其他地方,但这不会影响哈希表本身。

您可以使用SortedDictionary。如果我没有弄错的话,默认排序是ASC。但您也应该考虑性能(搜索时间和内存使用)方面的问题。看看DotNetPerls或MSDN文章。

最新更新