繁体   English   中英

按值排序字典,该值是具有DateTime的对象

[英]Sorting a Dictionary by value which is an object with a DateTime

我有一个结构测试,它作为值添加到字典中。 我想做的是按值的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.dt中对其进行排序。 我希望能够通过其ID选择一个对象,而且还能够迭代并按日期时间顺序显示它。

“对字典排序”是什么意思? 字典本身没有“顺序”。 这是一个键控集合,其基础实现是哈希表。

我假设您想说的是,“我想按值的顺序枚举字典的内容。” 这样就可以做到:

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 ) ;
}

另一方面,如果您实际上想要/需要有序集合,则需要确定您的实际需求是什么。

字典本质上是未排序的。 有IDictionary的排序实现,但通常按Key而不是value(或value的属性)排序。 如果您需要按值的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<,>的值部分KeyValuePair<,>或者返回一个匿名类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM