为什么DataTable.Select默认对数据进行排序

时间:2011-06-13 18:51:29

标签: c# sorting datatable dataset

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

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

为什么呢?如何将数据排除?这是至关重要的,因为我在图表对象中显示数据。我在这里错过了什么吗?

9 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我不知道为什么/如何在不改变原始结果集的情况下解决这个问题,但这是我的解决方法:

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

答案 2 :(得分:1)

同意!这很烦人......我有同样的问题。

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

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

答案 3 :(得分:1)

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

dataTable.AsEnumerable();

而不是

dataTable.Select();

答案 4 :(得分:0)

尝试:

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是按正确顺序排序的列。

答案 5 :(得分:0)

您从哪里获取数据?

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

杰夫

答案 6 :(得分:0)

如果数据已经在数据库中排序,可能就是它出现排序的原因。您显示的数据按名称排序。它是如何在数据库中的吗?

答案 7 :(得分:0)

我找到了另一种方法。如果我们必须使用 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%'")

答案 8 :(得分:-1)

DataView dv = datSource.DefaultView;

dv.RowFilter = strFilter;

如果您要对数据进行排序而不是使用dv.Sort = "..."

DataTable datTarget = dv.ToTable();