我有一个IEnumerable对象,我们用来表示用户操作。这是显示系统中最新动作的最终目的。该列表可能会变得很长,并且用户已要求该列表使用24小时。我想在此列表上执行一些“挤压”操作,就像Facebook对喜欢和评论的操作一样。例如,除了列出特定用户执行的所有37次更新外,我还可以列出该用户x更新了37年。

这些对象具有采取操作的用户名和日期时间作为属性,因此信息很容易选择。我需要一些帮助,以最佳方式以编程方式确定应压榨的东西。理想情况下,例如,如果同一位用户在不到10分钟的时间内在我们的系统中更新了1000余个人,那么我认为这是一次导入,而不是手动编辑,因此我将从操作列表中删除这些人,并将其替换为“所以因此进行了导入”

我将如何在IEnumerable中查询具有相同用户名并在特定日期范围内的对象?

编辑:我最初能想到的唯一事情是为每个可能的用户以及每个可能的10分钟时间周期遍历Enumerable。不过,这听起来效率极低,而我显然只是不知道可用的选项。

最佳答案

如果您可以使用Linq,则可以对用户名进行GroupBy操作,该操作将按用户名对所有项目进行分组,然后只需根据所需的时间阈值提取两个数据列表。

假设您有一个这样的对象列表

void Main()
{
    DateTime threshold = DateTime.Now.AddMinutes(-10);

    IEnumerable<UserAction> unfilteredActions = new List<UserAction>
    {
        new UserAction { Action = "INSERT", UserName = "Craig", ExecutedOn = DateTime.Now.AddMinutes(-15) },
        new UserAction { Action = "UPDATE", UserName = "Craig", ExecutedOn = DateTime.Now },
        new UserAction { Action = "DELETE", UserName = "James", ExecutedOn = DateTime.Now }
    };

    var userActions = unfilteredActions.Where(action => action.ExecutedOn > threshold).GroupBy(k => k.UserName);
}

public class UserAction
{
    public string Action {get;set;}
    public string UserName {get;set;}
    public DateTime ExecutedOn {get;set;}
}


您也可以像

foreach (var grp in unfilteredActions.GroupBy(k => k.UserName))
{
    foreach(UserAction action in grp.Where(a => a.ExecutedOn > threshold))
    {
        Console.Out.WriteLine(String.Format("{0} {1} {2}", action.UserName, action.Action, action.ExecutedOn));
    }
}

关于c# - 在IEnumerable中查询具有相似属性且在一定时间阈值内的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6377922/

10-12 00:25
查看更多