我有一个模型的C#列表。
List<FooModel> myModel;
public class FooModel {
public int CreationTimeInMs;
}
我的列表已按CreationTimeInMs(DSC)排序,我希望在过去30天内获得该列表的一部分。 例如: 如果我在列表中有1000个项目并且CreationTimeInMs返回2个月,我想仅列出过去30天的列表。
方法是什么?
答案 0 :(得分:2)
30天表示1000 * 60 * 60 * 24 * 30 = 2.592.000.000ms
在简单的Lambda表达式中使用它来过滤掉最新的模型。请注意,您需要知道&#34;实际时间&#34;。
UInt64 ActualTime = 12345; //Define the actual time in ms here
IEnumerable <myModel> NewestModels = myModel.Where(x => ActualTime - (Convert.ToUInt64(x.CreationTimeInMs)) > 2592000000);
现在您的NewestModels包含您需要的所有型号。
答案 1 :(得分:1)
解决方案如下:
long nowTimestamp = <compute now timestamp>;
long delta = 30 * 24 * 60 * 60 * 1000; // ms
var result = myModel.Where(item => nowTimestamp - item.CreationTimeInMs > delta);
但是,这种方法具有线性复杂度(O(list_length)),并且不使用它被排序的事实。
如果列表按降序排序,只要当前时间戳足够新,就可以构建另一个列表:
var recentList = new List<FooModel>();
foreach (var item in myModel)
{
if (nowTimestamp - item.CreationTimeInMs > delta)
break;
recentList.Add(item);
}
这是最快的方法,但要求列表以降序排列。
如果列表按升序排列,则必须先找到最后一个要包含的项目。如前所述,最快的方法是使用二分搜索方法,如this question中所示。
使用提供的索引,您可以获得所有后续元素:
int indexOfFirstElement = myModel.BinarySearchForMatch(item => item.CreationTimeInMs > nowTimestamp - delta);
var recentList = new List<FooModel>();
for (int i = indexOfFirstElement; i < myModel.Count; i ++)
{
recentList.Add(myModel[i]);
}
二进制搜索需要O(log(list_size)),列表构造为O(result_size)。
答案 2 :(得分:-1)
如果容器已经被排序,我将使用二进制搜索算法来找到下边界(或上边界),然后传递迭代器,以便接收器可以使用迭代器来处理所需的“部分”