【发布时间】:2019-09-17 20:44:46
【问题描述】:
各位程序员,
我有一个返回 IEnumerable(T) 的方法,其中 T 包含一个 DateTime 属性。
我需要从这组数据中执行许多基于日期的提取:例如,在 Date1 和 Date2 之间的所有项目。
随着数据集越来越大,我面临一个性能问题:这些提取需要一段时间。我觉得可以通过选择更适合枚举的数据结构来优化它。
我现在正在做的是:
public class Foo
{
public DateTime Date { get; set; }
public double Value { get; set; }
}
public class DoSomething
{
public IEnumerable<Foo> Foos { get;}
public IEnumerable<Foo[]> DoStuff(DateTime[] dates)
{
var foos = Foos.
OrderBy(x=>x.Date)
.ToArray(); //Prevents multiple enumeration later on, Any better suited structure ?
for (int i = 0; i < dates.Length-1; i++)
{
yield return foos
.Where(x => x.Date > dates[i])
.Where(y=>y.Date<dates[i+1])
.ToArray();
}
}
}
我读过 LINQ 方法 OrderBy 创建了一个 IOrderEnumerable,但我觉得将它枚举到一个数组会破坏逻辑顺序项目。如何防止多次枚举和保持顺序关系以供进一步使用?
【问题讨论】:
-
你的问题是那个循环。假设
foos包含 10,000 个项目。每个项目一次,循环遍历foos的整个 集合。你这样做 10,000 次。您似乎没有在我能看到的任何地方使用循环索引参数i。我看不出那个循环的目的......它的预期目的是什么? -
这个循环只是一个例子,它是一个人工制品,用于解释我需要多次执行此操作,如果有误导,请见谅。
-
这非常具有误导性。您的示例应该是说明性的或代表您的实际情况。 (这就是为什么我没有把它写成答案 - 感觉有点off)
-
当您
ToArray时,每次枚举时,都会保证生成的 IEnumerable(数组)的顺序正确。顺便说一句,您似乎没有使用循环变量i。从外观上看,您生成了几个 (foos.Length) 数组,每个数组的内容完全相同。我错过了什么? -
@XavierAM 通过编辑,这个问题更有意义。谢谢。
标签: c# linq sorting ienumerable