按值对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的顺序出现
你说的"排序字典"是什么意思?字典本身没有"秩序"。它是一个键集合,其底层实现是一个哈希表。
我假设您的意思是,"我想按值的顺序枚举字典的内容。"可以这样做:
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<,>
的值部分或返回匿名类型。