按ASC顺序的值排序哈希表

use*_*579 2 .net c# compact-framework

我在紧凑框架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          
     }
}
Run Code Online (Sandbox Code Playgroud)

我已经将哈希表初始化为case.我在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");
Run Code Online (Sandbox Code Playgroud)

我希望数据的打印顺序与列表中的顺序相同.这里的关键是时间,这里的时间默认是升序.但是在打印过程中打印的是这样的,

[11110,StackOverflow.Reading] 
[11111,StackOverflow.Reading] 
[11111,StackOverflow.Reading] 
[11112,StackOverflow.Reading] 
[11113,StackOverflow.Reading] 
[11115,StackOverflow.Reading] 
Run Code Online (Sandbox Code Playgroud)

我想要这样打印,

[11115,StackOverflow.Reading] 
[11111,StackOverflow.Reading] 
[11112,StackOverflow.Reading] 
[11110,StackOverflow.Reading] 
[11113,StackOverflow.Reading] 
[11111,StackOverflow.Reading]
Run Code Online (Sandbox Code Playgroud)

使用哈希表随机打印上面的内容而不是任何顺序.但是SortedList是按升序打印的.你能告诉我如何以相同的顺序打印列表中的数据.

Paw*_*elP 6

使用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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)