让用户排序记录?

时间:2009-01-24 04:27:22

标签: c# sql list sorting

我想找出一种让用户对记录进行排序的方法(等等的朋友列表)。

我想让用户有机会将记录(朋友)直接移到列表的顶部或底部,或者输入一个数字(介于两者之间)。

首先,我想到只是将一个名为SortOrder(int)的列添加到包含所有用户朋友的表中,并根据记录的显示顺序设置数字。

但是我要避免的是等等用户有400个朋友,如果他想将朋友编号400设置为列表中的位置1,那么我将不得不用新的更新每一条记录SortOrder的。

所有数据都存储在MS SQL数据库中。

我希望那里的人有一个神奇的解决方案吗?

6 个答案:

答案 0 :(得分:3)

对排序列使用浮点数

将初始项目设置为0.0,1.0等。

移至顶部,使用min -1.0。移至底部,设置为max + 1.0。在两个项目之间移动,设置为(prev + next)/2.0

这与行号方法类似,但数字之间有更多“空格”。从理论上讲,当两个相关值逐渐增大时,仍需要重新编号。我不知道这在实践中会发生多久,但我希望它很少见,所以这可以通过任何维护任务来完成。


[编辑] FWIW,这个问题又回到了我几次,所以here's a way that does roughly the same, but with strings

答案 1 :(得分:1)

我不认为他们经常这样做会成为一个真正令人担忧的事情,但是,如果你担心的话,请使用我们以前几天开创的BASIC代码的技巧。

当BASIC有行号时,我们只需将它们编号为10,20,30等等,这样如果我们需要在10到20之间插入一个,我们称之为15.或者如果20应该有来到10之前,我们将它重新编号为5。

使用32位整数列,你可以拥有200,000个间距为100的朋友,足以让他们四处移动,特别是如果你聪明的话。

您可能希望偶尔运行一次扫描作业,将朋友重新编号为100,200等等(对于您的社交网络来说,这是一种磁盘碎片整理程序)。不要试图通过查看朋友号码来检测这一点,使用另一个字段,当用户重新安排他们的朋友并在进行碎片整理时清除它时将其设置为true。这样会更有效率。

答案 2 :(得分:0)

听起来你正在寻找链表类型结构,其中每条记录都会按顺序保存下一条记录的ID。

答案 3 :(得分:0)

我不知道魔法,但是要移动到顶部或底部,你可以将SortOrder设置为MIN / MAX(SortOrder)+/- 1.谁说顶部必须是1或0?< / p>

答案 4 :(得分:0)

以下是我的方法:使用您的SortOrder列。据推测,会有一个初始的默认排序顺序,比如按字母顺序排列,因此每个人都会根据字母顺序获得SortOrder值。

然后,当用户将某个人移到顶部时,您可以将SortOrder设置为最大+1。如果他们将某人移到底部,那么它将是min -1。如果他们将某人移到中间的某个地方,那么你会想要计算他们移动到的中间的哪一半。如果它是上半部分,那么就将其上方的每个人的SortOrder提升。如果它是下半部分,那么减少以下所有人的SortOrder。

不确定是否有更方便的方法......

答案 5 :(得分:0)

你可以把它看成一群朋友。

最初,每个人都在第0组,订单是按名称或其他东西 - 如果用户然后将朋友(a)的“组”增加到1,则他们移动到顶部
- 如果用户然后将朋友(b)的“组”增加到1,则(a)和(b)出现在顶部
- 如果用户再次增加朋友(b)的“组”,则(b)显示第1和(a)第2

只是一个...... ...