按值对Dictionary排序,该值是一个带有DateTime的对象

本文关键字:一个 DateTime 对象 排序 Dictionary | 更新日期: 2023-09-27 18:06:45

我有一个结构体Test,我将其作为值添加到字典中。我要做的是按值的DateTime对字典进行排序。

    struct Test
    {
        DateTime dt;
        public string ID;
    }
    Dictionary<String, Test> dict = new Dictionary<String,Test>();
    Test t = new Test();
    t.dt = DateTime.Now;
    t.ID = "XUDF";
    dict.Add(t.ID, t);
    t.dt = DateTime.Now.AddDays(17);
    t.ID = "RFGT";
    dict.Add(t.ID, t);
    t.dt = DateTime.Now.AddDays(3);
    t.ID = "ADLV";
    dict.Add(t.ID, t);
    t.dt = DateTime.Now.AddHours(2);
    t.ID = "SKFU";
    dict.Add(t.ID, t);

我不知道以后该怎么办。还有,这是最好的方法吗?我用的是。net 3

我要做的是有一个列表,我可以通过ID访问,但也按t.t t中的日期时间排序。我希望能够根据对象的ID来选择对象,同时也能够通过迭代让它按照datetime的顺序出现

按值对Dictionary排序,该值是一个带有DateTime的对象

你说的"排序字典"是什么意思?字典本身没有"秩序"。它是一个键集合,其底层实现是一个哈希表。

我假设您的意思是,"我想按值的顺序枚举字典的内容。"可以这样做:

public void List( Dictionary<string,DateTime> dict )
{
  int i = 0 ;
  foreach( KeyValuePair<string,DateTime> entry in dict.OrderBy( x => x.Value ).ThenByDescending( x => x.Key ) )
  {
    Console.WriteLine( "{0}. Key={1}, Value={2}" , ++i , entry.Key , entry.Value ) ;
  }
  Console.WriteLine( "The dictionary contained a total of {0} entries." , i ) ;
}

另一方面,如果你确实想要/需要一个有序的集合,你需要说明你的实际需求是什么。

字典本身就是无序的。字典有排序的实现,但它们通常是按键排序,而不是按值(或值的属性)排序。如果需要按值的dt字段对值进行排序,可以这样做:

var valuesSorted = dict.Values.OrderBy(v=>v.dt);

但是这消除了字典。我怀疑您需要一种不同的数据结构,但是我们需要更多地了解用例以确定。

根据你的问题和其他人指出的,字典不是排序的,所以返回排序字典的唯一逻辑方法是真正返回排序的IEnumerable<KeyValuePair<String, Test>>。这很容易。

var query =
    from kvp in dict
    orderby kvp.Value.dt
    select kvp;

您可以轻松地更改select表达式以返回KeyValuePair<,>的值部分或返回匿名类型。