【问题标题】:Querying an IEnumerable for objects with like attributes and within a certain time threshold在某个时间阈值内查询具有相似属性的对象的 IEnumerable
【发布时间】:2011-09-16 16:50:10
【问题描述】:

我有一个 IEnumerable,里面装满了我们用来表示用户操作的对象。这是为了显示系统中最近执行的操作列表的最终目标。此列表可能会变得相当长,并且用户已请求列表的 24 小时期限。我想在这个列表上执行一些“挤压”,有点像 Facebook 为喜欢和 cmets 所做的。例如,我可以列出该用户 x 更新了 37 年,而不是列出特定用户执行的所有 37 次更新。

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

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

编辑:我最初能想到的唯一一件事是为每个可能的用户和每个可能的 10 分钟时间段迭代 Enumerable。不过,这听起来效率极低,而且我显然对可用的选项一无所知。

【问题讨论】:

    标签: c# .net artificial-intelligence ienumerable machine-learning


    【解决方案1】:

    如果您可以使用 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));
        }
    }
    

    【讨论】:

      【解决方案2】:

      事实证明,我错误地处理了这个问题。在尝试使用 LINQ 以不同方式查询数据集后,我意识到这是一个 AI 问题。我试图在每个用户和时间的基础上识别大型数据集中的数据组。

      这是一个聚类问题。我已经编写并发布了一个库来对 IEnumerable 中的对象执行 K 均值聚类。这个过程有点像这样:

      var clusters = SharpLearning.Clustering.KCluster(k, iterations, listOfIClusterableObjects);
      
      foreach (var cluster in clusters) {
          // Process some data.
          // clusters is a List<Cluster<T>> where your objects can be viewed in the .Members attribute
      }
      

      包含两个距离算法的Cluster类,IClusterable接口和KCluster算法都在C# Machine Learning Library中提供

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多