[英]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.