【问题标题】:Does an Enum exist for Asc or Desc ordering?是否存在用于 Asc 或 Desc 排序的枚举?
【发布时间】:2011-06-16 13:17:29
【问题描述】:

.NET 中是否有原生的 Enum 用于升序或降序?

我需要在不同的库中使用排序概念,我希望尽可能松耦合。

【问题讨论】:

  • 我认为他实际上是指一个枚举。听起来他只是想要一些东西用于排序方向(即用作参数时),如果它已经在 Fx 的某个地方。
  • @YetAnotherGeek “只有两个选项”绝不是使用布尔值的有效借口。布尔值存储真假。它们对于其他任何事物都是模棱两可的——包括性别、升序与降序等。

标签: c# .net


【解决方案1】:

.NET 中有超过 8 个排序枚举。事实证明,即使是在微软的工程师们也会重新发明轮子。有趣的是,评论实践和代码风格变化如此之大。

这是我找到的:

  1. System.ComponentModel.ListSortDirection

    public enum ListSortDirection {
        /// <devdoc>
        ///    <para>Sort in ascending order.</para>
        /// </devdoc>
        Ascending,
        /// <devdoc>
        ///    <para>Sort in descending order.</para>
        /// </devdoc>
        Descending 
    }
    
  2. System.Data.SqlClient.SortOrder

    public enum SortOrder {
        Unspecified     = -1,
        Ascending       = 0,
        Descending      = 1
    }
    
  3. System.Data.Linq.SqlClient.SqlOrderType

    internal enum SqlOrderType {
        Ascending,
        Descending
    }
    
  4. System.DirectoryServices.SortDirection

    public enum SortDirection
    {
        //
        // Summary:
        //     Sort from smallest to largest. For example, A to Z.
        Ascending,
        //
        // Summary:
        //     Sort from largest to smallest. For example, Z to A.
        Descending
    }
    
  5. System.Windows.Forms.SortOrder

    /// <include file='doc\SortOrder.uex' path='docs/doc[@for="SortOrder"]/*' />
    /// <devdoc>
    ///    <para>
    ///       Specifies how items in
    ///       a list are sorted.
    ///    </para>
    /// </devdoc>
    public enum SortOrder {
    
        /// <include file='doc\SortOrder.uex' path='docs/doc[@for="SortOrder.None"]/*' />
        /// <devdoc>
        ///    <para>
        ///       The items are
        ///       not sorted.
        ///    </para>
        /// </devdoc>
        None = 0,
    
        /// <include file='doc\SortOrder.uex' path='docs/doc[@for="SortOrder.Ascending"]/*' />
        /// <devdoc>
        ///    <para>
        ///       The items
        ///       are sorted in ascending order.
        ///    </para>
        /// </devdoc>
        Ascending = 1,
    
        /// <include file='doc\SortOrder.uex' path='docs/doc[@for="SortOrder.Descending"]/*' />
        /// <devdoc>
        ///    <para>
        ///       The items are
        ///       sorted in descending order.
        ///    </para>
        /// </devdoc>
        Descending = 2,
    
    }
    
  6. System.Web.Helpers.SortDirection

    public enum SortDirection {
        Ascending,
        Descending
    }
    
  7. System.Web.UI.WebControls.SortDirection

    public enum SortDirection {
    
    
        Ascending = 0,
    
    
        Descending = 1
    
    }
    
  8. System.Xml.XPath.XmlSortOrder

    public enum XmlSortOrder {
        Ascending       = 1,
        Descending      = 2,
    }
    
  9. System.Data.Common.EntitySql.AST.OrderKind

    /// <summary>
    /// Represents order kind (none=asc,asc,desc).
    /// </summary>
    internal enum OrderKind
    {
        None,
        Asc,
        Desc
    }
    

编辑:自最初发布以来,另一个已经到来。

  1. System.Web.UI.DataVisualization.Charting

    /// <summary>
    /// Sorting order (Ascending or Descending).
    /// </summary>
    public enum PointSortOrder
    {
        /// <summary>
        /// Ascending sorting order
        /// </summary>
        Ascending, 
    
        /// <summary>
        /// Descending sorting order
        /// </summary>
        Descending
    }
    

【讨论】:

  • 另请注意,虽然SortOrder 位于 System.Data.SqlClient 命名空间中,但它是由 System.Data 程序集定义的。
  • 查看这些我认为如果您假设订单必须存在,那么 DirectoryServices 选项是最好的。如果您想了解自然顺序的概念,那么 SqlClient 会更胜一筹。但是我不知道为什么有人会费心最终发送消息“通过不以任何特定方式订购来订购 Foo”......也许如果您希望未指定意味着洗牌结果,那将是合理的。
  • 再仔细看一下,我才意识到 Active Directory 服务不像文件系统目录。 SqlClient 的 SortOrder 在 .NET Core 中,XmlSortOrder 也是。显然,如果您不希望 SqlClient 中包含未指定的排序,那么确实没有好的选择
  • 出于通用目的,我个人更喜欢 ListSortDirection。
  • 谢谢,我选择了 ListSortDirection,因为它是少数(或唯一)不需要额外包的之一,因为它位于 System.ComponentModel 命名空间中。
【解决方案2】:

【讨论】:

  • 正确答案!使用什么更好(可能是原子的、简单的)库?我将在存储库的接口中使用它,所以 SortOrder 是更好的选择?
  • 根据@andrecarluccis 的出色回答判断,如果您只需要升序/降序,ListSortDirection 会更好 - 因为更多目标可用。
  • 我也会说 ListSortDirection,因为另一个与 SqlClient 绑定。​​
  • 请注意,尽管SortOrder 位于 System.Data.SqlClient 命名空间中,但它是由 System.Data 程序集定义的,可供更广泛的受众使用。
【解决方案3】:

SortOrderListSortDirection 是两个有效的选择,但请记住:

ListSortDirection:

  • 在 .net 版本 1.1 到 4 和 silverlight 中可用。
  • 排序顺序是强制性的:ListSortDirection 只有“升序”和“降序”选项,因此用户也可以选择其中之一。

SortOrder:

  • 仅在 .net 版本 3.5 和 4 中可用。不支持 silverlight。
  • 排序顺序是可选的:您还有“未指定”选项。

【讨论】:

    【解决方案4】:

    Windows.Forms.SortOrderData.SqlClient.SortOrder 相关的有趣点

    经检查,第一个具有值:

    public enum SortOrder
    {
        None = 0,
        Ascending = 1,
        Descending = 2,
    }
    

    而第二个有值:

    public enum SortOrder
    {
        Unspecified = -1,
        Ascending = 0,
        Descending = 1,
    }
    

    保持一致可能是个好主意,尤其是在序列化时。

    【讨论】:

      【解决方案5】:

      我知道有两个: SortDirectionSortOrder

      一个简短的警告是,它们分别位于 System.Web.UI.WebControlsSystem.Windows.Forms 命名空间中,因此它们可能不适用于您正在做的事情语义。 p>

      【讨论】:

      • 你是对的。但是您认为这在语义上是错误的,因为我在这些库中没有对 UI 或表单的引用。
      • 我正在考虑 System perharps 内部的一些东西。
      猜你喜欢
      • 2015-03-05
      • 1970-01-01
      • 2017-10-27
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 2019-08-13
      • 2011-06-28
      相关资源
      最近更新 更多