【发布时间】:2018-01-16 16:44:15
【问题描述】:
在 C# 中,给定一个 SortedDictionary,我需要过滤它的键,然后“简化”它的值。下面的 MWE 可以很好地解释这一点,它完全符合我的要求
static void Main()
{
var lowerBound = new DateTime(2018, 01, 02);
var upperBound = new DateTime(2018, 01, 04);
var myInput = new SortedDictionary<DateTime, SimpleItem>();
myInput.Add(new DateTime(2018, 01, 01), new SimpleItem { item1 = 1.1, item2 = 2.1 });
myInput.Add(new DateTime(2018, 01, 02), new SimpleItem { item1 = 1.2, item2 = 2.2 });
myInput.Add(new DateTime(2018, 01, 03), new SimpleItem { item1 = 1.3, item2 = 2.3 });
myInput.Add(new DateTime(2018, 01, 04), new SimpleItem { item1 = 1.4, item2 = 2.4 });
myInput.Add(new DateTime(2018, 01, 05), new SimpleItem { item1 = 1.5, item2 = 2.5 });
myInput.Add(new DateTime(2018, 01, 06), new SimpleItem { item1 = 1.6, item2 = 2.6 });
myInput.Add(new DateTime(2018, 01, 07), new SimpleItem { item1 = 1.7, item2 = 2.7 });
var q = myInput.Where(x => x.Key >= lowerBound && x.Key <= upperBound);
Dictionary<DateTime, double> d =
q.ToDictionary(x => x.Key, x => x.Value.item1);
SortedDictionary<DateTime, double> myOutput =
new SortedDictionary<DateTime, double>(d);
int wait = 0;
}
class SimpleItem
{
public double item1 { get; set; }
public double item2 { get; set; }
}
通过分析我的实际代码(不是这个 MWE),很明显ToDictionary 非常非常慢(所有其他部分看起来都还可以)。所以我只是要求另一种方式(希望是最快的)来做同样的事情。
【问题讨论】:
-
你有多少个元素,“非常慢”是什么意思?
-
如果您不需要 modify 生成的字典(只需从中读取值),我的建议是围绕它创建一个包装器:A new class which implements
IDictionary<DateTime, double>和IEnumerable<KeyValuePair<DateTime, double>>(或您实际需要的SortedDictionary的任何部分)“过滤”数据请求,如果在请求范围内,则将它们转发到“真实”字典。 -
加入 Heinzi 的建议和不可变的字典/包装器,你就准备好了!
-
此 MWE 是否真实表示将使用的数据? “简单物品”代表什么?我问这个的原因是“简单项目”分配占用的内存大约是它们所代表的日期的两倍。您是否尝试过使用浮点数而不是双精度数?
-
非常慢,我的意思是配置文件显示 80-90% 的时间花在 ToDictionary 上——这是通过运行一个执行许多其他操作的程序。 SimpleItem 只是为了获得一个 MWE,实际上我有一个简单的 cals 有一些双打,一些字符串等等,但最后我只需要获得一个双打。
标签: c# linq dictionary sorteddictionary