【问题标题】:Why DataTable.Select sorts the data by default为什么 DataTable.Select 默认对数据进行排序
【发布时间】:2011-09-14 03:46:35
【问题描述】:

我有一个包含以下数据的数据集

Name          Value    Percent
0-3 months    0        0
3-12 months   0        0
1-5 years     1234.12  28
5-10 years    13144.11 68
10-15 years   0        0
Over 15 years 1233.44  14
Other Income  2245.12  

当我尝试时

foreach (DataRow dr in dsMaturity.Tables[0].Select("name not like 'Other%'"))
{
    TotalValue += double.Parse(dr["Value"].ToString());
}

编辑:实际上,类似于上面的代码。我正在使用类似的循环将数据添加到最终写入图表的显示桶。

foreach (DataRow dr in dsMaturity.Tables[0].Rows)
{
    //Add to the display bucket
}

我得到的数据排序如下:

0-3 months
10-15 years
1-5 years
3-12 months
5-10 years
Over 15 years

为什么?我怎样才能使数据未排序?这很关键,因为我在图表对象中显示数据。我在这里遗漏了什么吗?

【问题讨论】:

  • 如果强行下单,我觉得不会改的。
  • 似乎您的数据是按第一列排序的,作为文本。但是,为什么这很重要?
  • 我没有强制任何排序,这是来自数据库的默认顺序。订购对用户很重要。

标签: c# sorting datatable dataset


【解决方案1】:

尝试:

foreach (DataRow dr in dsMaturity.Tables[0].Select("name not like 'Other%'", "column_to_sort_by"))
{
    TotalValue += double.Parse(dr["Value"].ToString());
}

其中column_to_sort_by 是按正确顺序排序的列。

【讨论】:

    【解决方案2】:

    您从哪里获取数据?

    如果它来自数据库,那么当您手动运行查询时,我会检查并查看顺序。

    杰夫

    【讨论】:

    • 数据由过程创建,并将它们添加到返回数据集。我无权修改程序。我得到数据,只是想以相同的顺序显示它。
    【解决方案3】:

    如果数据已在数据库中排序,这可能就是它显示已排序的原因。您提供的数据看起来按名称排序。数据库中是这样的吗?

    【讨论】:

    • 不是简单的select语句和order by子句类型的查询。数据库按某种规则创建这些行。我提到的数据集是我从数据库中得到的。现在如何在不重新排列原始数据集中的记录的情况下使用 select?
    【解决方案4】:

    我不确定为什么/如何在不更改原始结果集的情况下解决此问题,但这是我的解决方法:

    foreach (DataRow dr in dsMaturity.Tables[0].Rows)
    {
        if (!dr["Name"].ToString().StartsWith("Other "))
        {
            // adding it to display bucket
        }
    }
    

    【讨论】:

      【解决方案5】:

      dataTable.Select(filterExpression) 不保证排序顺序。正如文档所说,您应该使用其他重载中的一个来提供排序顺序。

      在我们的实验中,结果集是按过滤器列排序的,但我不相信 .NET 的更高版本会以相同的方式运行(因为它没有以这种方式记录)。

      【讨论】:

        【解决方案6】:

        同意!这很烦人......我遇到了同样的问题。

        如果您有 .net 3.5+,您可以使用 Linq 过滤行:

        var rows = dt.Rows.Cast<DataRow>().Where(r => !((string)r["Name"]).StartsWith("Other")
        

        【讨论】:

          【解决方案7】:

          我也有这个问题,答案是:

          dataTable.AsEnumerable();
          

          而不是

          dataTable.Select();
          

          【讨论】:

            【解决方案8】:
            DataView dv = datSource.DefaultView;
            
            dv.RowFilter = strFilter;
            

            如果您希望数据排序而不是使用dv.Sort = "..."

            DataTable datTarget = dv.ToTable();
            

            【讨论】:

              【解决方案9】:

              我找到了另一种方法。如果我们必须使用 SELECT,而不是之前答案中建议的 LINQ,我们应该临时添加一个新的索引列,进行选择并按索引排序,然后删除该列。

              对此的扩展方法可能如下所示:

                  public static DataRow[] NotSortedSelect(this DataTable table, string filter)
                  {
                      DataColumn column = new DataColumn
                      {
                          ColumnName = Guid.NewGuid().ToString(),
                          DataType = typeof(int)
                      };
              
                      table.Columns.Add(column);
                      int rowid = 1;
                      foreach (DataRow dr in table.Rows)
                      {
                         dr[column] = rowid++;
                      }
              
                      var rows =  table.Select(filter, $"{column.ColumnName} ASC");
                      var newDataTable = rows.CopyToDataTable();
                      newDataTable.Columns.Remove(column.ColumnName);
                      
                      return newDataTable.Select();
                  }
              

              像这样使用它:

                  dsMaturity.Tables[0].NotSortedSelect("name not like 'Other%'")
              

              【讨论】:

                猜你喜欢
                • 2015-03-03
                • 2019-11-25
                • 2020-10-27
                • 1970-01-01
                • 1970-01-01
                • 2022-07-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多