【问题标题】:Sorting strings by specified order按指定顺序对字符串进行排序
【发布时间】:2018-11-23 08:37:17
【问题描述】:

我需要了解如何按预定义的模式对一些数据进行排序。

假设我有一些字符串,代表产品信息,例如。 G。

Product1,红色,70/n

Product6,蓝色,90/n

Product3,红色,50/n

Product9,白色,33/n

我用逗号分隔这些字符串并将它们存储在不同的数组(名称、颜色、价格)中,然后存储在具有相同列的 DataTable 中。

我可以使用以下命令按颜色排序创建的行:

DataView.sort = "color" 

或通过 LINQ 使用

DataRow[] dr = table.Select().OrderBy(u=>u[color]).ToArray();
DataTable sortedtable = dr.CopyToDataTable(); 

但这只是简单的排序,asc/desc,基于字母表。

我想用预定义的模式来实现排序。例如,项目订单将由红色、黑色、蓝色、白色的颜色定义。

有什么简单的我可以做的吗?我认为这可以通过检查每行颜色并将其与预定义的颜色列表进行比较,然后根据此顺序构建新的 Array / DataTable 来实现。但是我觉得这是一个弱的方法。

【问题讨论】:

  • 对不起,这只是代码的一部分,实际上我是在手机上写的,但完整的代码是:DataRow[] dr = table.Select().OrderBy(u =>u[颜色]).ToArray();数据表 sortedtable = dr.CopyToDataTable();

标签: c# sorting


【解决方案1】:

您可以将订单存储在另一个集合中,然后使用IndexOf

var colorOrderList = new List<string>{"red", "black", "blue", "white"};
table = table.AsEnumerable()  
    .OrderBy(row => colorOrderList.IndexOf(row.Field<string>("color")))
    .CopyToDataTable();

【讨论】:

  • 如果有序列表更长,您可以使用Dictionary&lt;string, int&gt; 将字符串映射到等级,以将排序中的 O(N) 操作减少为 O(1) (其中 N = 已排序的字符串数,而不是正在排序的字符串数)。
【解决方案2】:

你可以像定义n个排序数组

var order = new [] { "red", "blue", "white"};

然后使用 IndexOf

DataRow.Select().OrderBy(u=>Array.IndexOf(order, u[color]))

【讨论】:

  • 如果将订单存储在数组中,则需要使用Array.IndexOf,没有扩展名。此外,DataTable.Select 返回一个新的DataRow[]。在不以某种方式将其重新分配给桌子的情况下订购它是毫无意义的
  • 不妨先高亮不认识的颜色会用这个排序。 (不建议您需要添加处理此问题的所有选项,如果不需要,只需提及)
  • 非常感谢你们,惊人的答案,帮助了很多。我绝对需要了解 LINQ
【解决方案3】:
【解决方案4】:

Products.OrderBy(u =&gt; u == "Red" ? 0 : u == "Black" ? 1 : u == "Blue" ? 2 : 3)

它的优点是它应该可以转换为 SQL 语句,以便数据库服务器可以进行排序。

【讨论】:

    【解决方案5】:

    您可以使用 IComaparable。首先创建一个可以容纳您的产品详细信息的自定义类。让这个类实现 IComparable 接口。

     public class ProductDetails : IComparable
        {
            public int ProductId { get; set; }
            public int CompareTo(object obj)
            {
                ProductDetails prodDetails = obj as ProductDetails;
                if (obj == null) return 1;
    
                if (prodDetails != null)
                {
                    if (this.ProductId < prodDetails.ProductId) return 1;
                    else
                        return 0;
    
                }
                else {
                    return 0;
                }
    
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-21
      • 2014-02-08
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多