查询具有相似属性且在特定时间阈值内的对象的IEnumerable

时间:2011-06-16 20:05:57

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

我有一个IEnumerable充满了我们用来表示用户操作的对象。这是为了显示系统中最近采取的操作列表的最终目标。此列表可能会变得相当长,并且用户已请求24小时的列表。我想在这个列表上执行一些“挤压”,就像Facebook对喜欢和评论所做的那样。例如,代替列出特定用户执行的所有37个更新,我可以列出该用户x更新37 y。

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

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

编辑:我唯一能想到的就是为每个可能的用户和每个可能的10分钟时间段迭代Enumerable。虽然这听起来非常低效,但我显然不知道可用的选项。

2 个答案:

答案 0 :(得分: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));
    }
}

答案 1 :(得分:0)

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

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

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

中提供