我有一个包含以下数据的数据集
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
为什么呢?如何将数据排除?这是至关重要的,因为我在图表对象中显示数据。我在这里错过了什么吗?
答案 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();