编辑:许多答案建议计算使用对象的次数。这种方法不起作用,因为所有对象都被使用相同的次数,只是使用的顺序不同。
objects.OrderByDescending(o => o.UsedCount);
我会保持一个运行计数器,记录对象被使用的次数以及使用顺序。
因此,如果对象X是第三次使用,则将其与运行计数器平均,并使用结果作为其在列表中的位置。
例如:
项目 使用次数 使用顺序 --------------------------------------- 对象X 10 1,2,3,1,2,1,3,1,2,2 (18) 对象Y 10 3,1,2,3,3,3,1,3,3,1 (23) 对象Z 10 2,3,1,2,1,2,2,2,2,3 (20)
使用次数是用户使用对象的次数,使用顺序是该项在顺序中使用的列表(或总和)。
单独使用每个顺序的列表可能会有一些性能问题,因此您可能只想保留位置的总和。如果您保留总和,每次使用对象时只需将顺序添加到该总和即可。
为了计算位置,您只需要使用位置之和除以使用次数,就可以得到平均值。在这一点上,您所要做的就是按平均值对列表进行排序。
在上面的例子中,您将得到以下平均值(和顺序):
对象 X 1.8 对象 Z 2.0 对象 Y 2.3
class User
{
Collection<Algo> algosUsed = new List<Algo>(); //Won't compile, used for explanation
...
}
你的算法类看起来像这样:
class Algo
{
int usedCount;
...
}
您应该能够将Algo
对象的特定实例绑定到User
对象,以允许记录其使用频率。在最基本的级别上,您将把信息序列化到文件或流中。最可能的是,您需要一个数据库来跟踪正在使用的内容。然后,当您获取您的User
并调用sort
函数时,您将通过Algo
的usedCount
参数对User
的algos
参数进行排序。
编辑:添加了一个排序偏好!请查看代码
我不喜欢上次使用的方法,因为它会导致许多排序更改,这很令人困惑。
count_accessed字段要好得多,尽管我认为它应该被平衡到用户在过去XX分钟/小时/天等中访问此项的次数。
最好的数据结构肯定是
static TimeSpan TIME_TO_LIVE;
static int userOrderFactor = 0;
LinkedList<KeyValuePair<DateTime, int>> myAccessList = new LinkedList<KeyValuePair<DateTime, int>>();
private void Access_Detected()
{
userOrderFactor++;
myAccessList.AddLast(new KeyValuePair<DateTime, int>(DateTime.Now, userOrderFactor));
myPriority += userOrderFactor; // take total count differential, so we dont waste time summing the list
}
private int myPriority = 0;
public int MyPriority
{
get
{
DateTime expiry = DateTime.Now.Subtract(TIME_TO_LIVE);
while (myAccessList.First.Value.Key < expiry)
{
myPriority += myAccessList.First.Value.Value; // take care of the Total Count
myAccessList.RemoveFirst();
}
return myPriority;
}
}
添加一个日期时间列表,记录用户访问对象的时间。每当用户使用一个对象时,都要添加一个日期时间。
现在只需计算列表中 w 天前(即当前时间减去 x 天)的日期时间条目数量,并按此进行排序。您可以删除大于 (now - x 天) 的日期时间。
可能会出现用户在一个月内使用不同的项目,这将反映这些更改。
听起来你想要一个缓存。我猜你可以看一下缓存使用的算法,然后去掉关于上下文切换的整个业务...有一个叫做“时钟扫描”的算法...但是这可能对你所寻找的东西来说太复杂了。为了走捷径,我建议只需将“已使用的物品”:使用次数制作成哈希表,或者在你的类中,每次使用对象时都增加一个变量。
每隔一段时间按num_of_uses对哈希表进行排序,或按其++'d变量的值对对象进行排序。
来自https://dev59.com/m03Sa4cB1Zd3GeqPsR3O#2619065:
也许可以使用OrderedMultiDictionary,以usedCount作为键,以对象作为值。
当用户与一个对象交互时,保存上一个操作对象的ID到该第二个对象上,以便您始终有指向任何给定对象之前使用的对象的指针。
此外,存储最常用的第一个使用的对象的ID,以便您知道从哪里开始。
在构建要显示的对象列表时,您从已存储为最常用的第一个使用的对象开始,然后搜索具有存储在其上的第一个使用的对象ID的对象以显示下一个对象。