C# 排序和更新datatable未产生预期结果
编辑:我自己解决了这个问题-很明显,排序dataTable不会对底层数据进行排序-从表中创建dataView,效果很好 我有一个datatable,我正在对它进行排序,然后迭代以删除一列中的重复值,但是输出并不像预期的那样 数据表结构:C# 排序和更新datatable未产生预期结果,c#,.net,sorting,datatable,C#,.net,Sorting,Datatable,编辑:我自己解决了这个问题-很明显,排序dataTable不会对底层数据进行排序-从表中创建dataView,效果很好 我有一个datatable,我正在对它进行排序,然后迭代以删除一列中的重复值,但是输出并不像预期的那样 数据表结构: infoRow["Title"] infoRow["QuickLink"] infoRow["Description"] infoRow["Date"] infoRow["MonthName"] 我是这样排序的,它工作得很好,并生成一个按月升序排序的表: da
infoRow["Title"]
infoRow["QuickLink"]
infoRow["Description"]
infoRow["Date"]
infoRow["MonthName"]
我是这样排序的,它工作得很好,并生成一个按月升序排序的表:
dataTable = dataTable.DefaultView.ToTable(true);
dataTable.DefaultView.Sort = "Date asc";
排序之后,我使用下面的代码将每一行与前一行进行比较,如果MonthName值相同,则将其替换为空字符串:
string prevMonthName = "";
foreach (DataRow row in dtEvents.Rows)
{
string strMonthName = row["MonthName"].ToString();
if (strMonthName == prevMonthName)
{
row["MonthName"] = "";
row.AcceptChanges();
}
prevMonthName = strMonthName;
}
所以,我遇到的问题是,即使在排序之后运行MonthName循环,它似乎也是针对未排序的数据运行的。这与DefaultView.Sort类似,它只影响呈现的输出,而不会对表进行物理重新排序,因此代码的第二部分不会产生我需要的结果。我应该使用DataView还是偏离正轨…假设dtEvents引用的对象与datatable相同,您可以尝试以下方法:
string prevMonthName = "";
foreach (DataRowView row in dtEvents.DefaultView)
{
string strMonthName = row["MonthName"].ToString();
if (strMonthName == prevMonthName)
{
row["MonthName"] = "";
row.AcceptChanges();
}
prevMonthName = strMonthName;
}
只是为了好玩,我想出了如何使用LINQtoSQL实现这一点(假设我有一个包含上述模式的SQL表)。既然我花了很多时间想出来,我想我还是分享一下吧
// Order the table and add an index column
var ordered = MonthTests.OrderBy(mt => mt.Date)
.AsEnumerable()
.Select((mt, index) => new
{
OrderId = index,
Record = mt
});
// Select out what we want
var query = from item in ordered
let prev = ordered.FirstOrDefault (q => q.OrderId == (item.OrderId-1))
select new
{
Title = item.Record.Title,
QuickLink = item.Record.QuickLink,
Date = item.Record.Date,
MonthName = (prev != null && prev.Record.MonthName == item.Record.MonthName) ? "" : item.Record.MonthName
};
玩得开心。我实际上遇到了一个类似但略有不同的问题,你的问题给了我一个想法。事实证明,您的代码非常接近您(和我)的需要。您只需翻转这两行排序代码,如下所示:
dataTable.DefaultView.Sort = "Date ASC";
dataTable = dataTable.DefaultView.ToTable(true);
现在,第一行代码对DefaultView进行排序。这对于DataGridView或ComboBox或用于显示的任何东西都足够了,因为它们使用DefaultView。但是,数据表本身仍然未排序。因此,第二行将DataTable设置为与排序后的DefaultView完全相同
我刚注意到你在顶部的编辑,上面写着你已经解决了这个问题。这种“解决方案”似乎更像是一种变通办法。鉴于您的代码是正确的,但顺序是错误的,我想您会对这个答案感兴趣 dtEvents和datatable引用的对象是否相同?