【问题标题】:How to handle sorting "strings"?如何处理排序“字符串”?
【发布时间】:2015-04-10 13:16:40
【问题描述】:

假设我有一个包含项目的有序列表,每个项目都可以在这个列表中上下排序。第一个想法是有一个 int(ex 1-10) 的 SortOrder。这样做的问题是我在排序时总是必须更新至少 2 个项目(第 3 项代替第 4 项,从而切换排序值)。如果我在位置 3 放置一个新项目,所有 > 3 的项目都必须更改 sortOrder。

所以为了避免这种情况,我可以使用更大的间隔,例如:

N1 : 10 000
N2 : 20 000
N3 : 30 000
N4 : 40 000
N5 : 50 000

如果将 N4 排序为上一级,它将如下所示:

N1 : 10 000
N2 : 20 000
N4 : 25 000
N3 : 30 000
N5 : 50 000

我的问题是如何在 C# 中以最佳方式处理这个问题?我应该使用什么数据类型?我如何避免经常重新生成整个列表(当不再可以进行排序时)?

我自己的想法是将它作为十进制存储在代码和数据库中。

【问题讨论】:

  • 这看起来像是一个建议的解决方案,而不是一个问题。你能解释一下你要解决的问题吗?我不认为使用 int 或 decimal 或任何排序是一件坏事。只是问题没有解释为什么您要插入新项目或更改现有项目的排序顺序。如果你解释一下,我认为你会有更好的机会得到一个好的答案。
  • 更新/交换两个号码有什么问题?
  • 我尽量减少更新,包括往返数据库和 GUI 更新。
  • 还有一件事,会有很多用户同时排序,我想避免锁定所有内容。

标签: c# sql sql-server sorting


【解决方案1】:

我使用的方法是使用 int 数据类型的专用 DisplayOrder 列;我(通常)对列进行索引,但不使用唯一索引。这样通过更新值来交换两个项目就不会太痛苦了。通常(默认情况下)我不需要通过 UI 使值可见,因此实际值并不重要。如果拥有唯一值很重要,那么这也可以工作 - 我有一个 proc 可以在需要时从 1 中“重新设置”订单值。

【讨论】:

    【解决方案2】:

    为什么在代码中需要一个“排序顺序”字段?

    如果您将内存中的项目放在列表或其他容器中,那么项目的顺序就是排序顺序。

    您只需要在将数据持久化到数据库或其他方式时分配一个数值。然后,当您检索项目以重新填充内存数据时,获取它们并按排序顺序添加到列表中。

    此方法允许对项目进行任何重新排序以及删除项目,而无需维护排序顺序值,直到您保存数据为止。

    【讨论】:

    • 问题是任何排序更改都必须保存到数据库中。所以我试图做尽可能少的更新。
    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2010-11-19
    相关资源
    最近更新 更多