如何使用创建时间返回列表的一部分?

时间:2016-03-27 08:02:21

标签: c# .net

我有一个模型的C#列表。

List<FooModel> myModel;

public class FooModel {
    public int CreationTimeInMs;
}

我的列表已按CreationTimeInMs(DSC)排序,我希望在过去30天内获得该列表的一部分。 例如: 如果我在列表中有1000个项目并且CreationTimeInMs返回2个月,我想仅列出过去30天的列表。

方法是什么?

3 个答案:

答案 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)

如果容器已经被排序,我将使用二进制搜索算法来找到下边界(或上边界),然后传递迭代器,以便接收器可以使用迭代器来处理所需的“部分”