按ASC顺序的值排序哈希表

时间:2014-09-09 16:34:40

标签: c# .net 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          
     }
}

我已经将哈希表初始化为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");

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

[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是按升序打印的。你能告诉我如何以相同的顺序打印列表中的数据。

3 个答案:

答案 0 :(得分: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;
        }
    }
}

答案 1 :(得分:2)

HashTable中的项目本质上是无序的。你不能订购它们。如果您想按特定顺序购买物品,则需要使用可订购的集合。您可以从集合中获取项目,然后将它们放在其他位置,但它不会影响哈希表本身。

答案 2 :(得分:0)

您可以使用SortedDictionary。如果我没有弄错,默认排序是ASC。但是你也应该考虑性能(搜索时间和内存使用)方面。查看DotNetPerlsMSDN条。