【问题标题】:Let user sort records?让用户排序记录?
【发布时间】:2009-01-24 04:27:21
【问题描述】:

我正在想办法让用户对记录(等朋友列表)进行排序。

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

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

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

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

我希望有人对此有一个神奇的解决方案?

【问题讨论】:

    标签: c# sql list sorting


    【解决方案1】:

    对排序列使用浮点数

    将初始项设置为 0.0、1.0 等

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

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


    [edit] FWIW,这个问题又来了几次,所以here's a way that does roughly the same, but with strings

    【讨论】:

    • 谢谢。这听起来像是解决问题的最佳方法。 :)
    • 谢谢 - 它的简单性非常棒,两年后仍然有用!
    【解决方案2】:

    我不认为他们会经常这样做以引起真正的担忧,但是,如果您担心,请使用我们从过去几天开始使用 BASIC 代码开创的技巧。

    当 BASIC 有行号时,我们只需将它们编号为 10、20、30 等等,因此如果我们需要在 10 和 20 之间插入一个,我们将其称为 15。或者如果 20 应该有在 10 之前,我们会将其重新编号为 5。

    使用 32 位整数列,您可以拥有 200,000 个间距为 100 的朋友,这足以移动事物,尤其是如果您很聪明的话。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 听起来是正确的解决方案,除了将其存储在关系数据库中并基于链表结构对结果进行排序将非常困难且耗时。
      【解决方案4】:

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

      【讨论】:

      • 这实际上只处理移动到顶部或底部,而不是在某个地方的中间。不过,我不会对您进行 -1,因为它对那些有限的情况很有帮助,特别是如果您的初始 SortOrder 键在允许范围的中间(比如 2^30 用于有符号的 32 位 int)。
      【解决方案5】:

      我会这样做:使用您的 SortOrder 列。大概会有一个初始的默认排序顺序,比如字母顺序,因此每个人都会根据他们的字母顺序获得一个 SortOrder 值。

      然后,当用户将某人移到顶部时,您只需将 SortOrder 设置为最大 +1。如果他们将某人移到底部,那么它将是 min -1。如果他们将某人移动到中间的某个地方,那么您需要计算他们正在移动到中间的哪一半。如果是上半部分,则提高他们上方每个人的 SortOrder。如果是下半部分,则减少下面每个人的 SortOrder。

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

      【讨论】:

      • 最坏的情况是将某人从最后一个朋友转移到第二个最好的朋友,然后您必须更改 N-1 条记录。如果您希望最小化行更改,有更好的方法。不过,我不会对你 -1,因为它很有帮助。
      • 在你的场景中,为什么不将最好朋友的 SortOrder 增加 1,然后将你要移动的朋友(最后一个朋友)的 SortOrder 设置为最好朋友的 SortOrder-1?
      • 对不起,迈克,我假设当前最好的朋友的排序顺序是 0,而不是 N-1。在这种情况下,我的评论适用于列表的另一端。不过,我想在这种情况下你可能会变得消极。
      【解决方案6】:

      您可以将其视为一群朋友。

      最初,每个人都在第 0 组,顺序是按名称或其他什么的。
      - 如果用户随后将朋友 (a) 的“组”增加到 1,则他们移至顶部
      - 如果用户随后将朋友 (b) 的“群组”增加到 1,则 (a) 和 (b) 出现在顶部
      - 如果用户随后再次增加朋友 (b) 的“组”,则 (b) 出现第 1 个和 (a) 第 2 个

      只是一个想法......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-18
        相关资源
        最近更新 更多