我的建议是离开DateTime
以其自然的形式,让生活变得更轻松
你可以做这样的事情
Given
public static void Serialize(Dictionary<DateTime, int> dictionary, Stream stream)
{
var writer = new BinaryWriter(stream);
writer.Write(dictionary.Count);
foreach (var kvp in dictionary)
{
writer.Write(kvp.Key.ToBinary());
writer.Write(kvp.Value);
}
writer.Flush();
}
public static Dictionary<DateTime, int> Deserialize(Stream stream)
{
var reader = new BinaryReader(stream);
var count = reader.ReadInt32();
var dictionary = new Dictionary<DateTime, int>(count);
for (var n = 0; n < count; n++)
{
var key = DateTime.FromBinary(reader.ReadInt64());
var value = reader.ReadInt32();
dictionary.Add(key, value);
}
return dictionary;
}
Usage
// Create some data
var dictionary = new Dictionary<DateTime, int>();
dictionary.Add(DateTime.Now.AddDays(-10), 34);
dictionary.Add(DateTime.Now.AddDays(-5), 234);
dictionary.Add(DateTime.Now.AddDays(-2), 345);
dictionary.Add(DateTime.Now, 434);
// Example using sum
var sum = dictionary.Where(x => x.Key > DateTime.Now.AddDays(-6) && x.Key < DateTime.Now.AddDays(-1))
.Sum(x => x.Value);
Console.WriteLine(sum);
// write to file
using (var fileStrem = new FileStream(@"D:\dict.dat", FileMode.Create))
{
Serialize(dictionary, fileStrem);
}
// Read from file
using (var fileStrem = new FileStream(@"D:\dict.dat", FileMode.Open))
{
dictionary = Deserialize(fileStrem);
}
// sanity check
sum = dictionary.Where(x => x.Key > DateTime.Now.AddDays(-6) && x.Key < DateTime.Now.AddDays(-1))
.Sum(x => x.Value);
Console.WriteLine(sum);
Output
579
579
Update
Enumerable.Where 方法 (IEnumerable, Func) https://msdn.microsoft.com/en-us/library/bb534803(v=vs.110).aspx
根据谓词过滤值序列。
本质上,您可以在字典上使用 where 子句,因为它基本上只是键值对结构 https://msdn.microsoft.com/en-us/library/5tbh8a42(v=vs.110).aspx
定义可以设置或检索的键/值对。
您可能还想阅读有关 Linq 的内容
语言集成查询 (LINQ) http://%20https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/
Update
是否有可能有一个字典,其键相同,但
他们有不同的价值观?
你最好只使用List<T> https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx在这种情况下
你可以这样做,看看这个问题键值对列表 https://stackoverflow.com/questions/18801466/key-value-pair-list
var list = new List<KeyValuePair<DateTime, int>>()
然后在您的灭菌方法中只需更改所有出现的
Dictionary<DateTime, int>
to
KeyValuePair<DateTime, int>
and
List<KeyValuePair<DateTime, int>>
然后添加
list.Add(new KeyValuePair<DataTime, int>(myDate,ads));