Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 排序和更新datatable未产生预期结果_C#_.net_Sorting_Datatable - Fatal编程技术网

C# 排序和更新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

编辑:我自己解决了这个问题-很明显,排序dataTable不会对底层数据进行排序-从表中创建dataView,效果很好

我有一个datatable,我正在对它进行排序,然后迭代以删除一列中的重复值,但是输出并不像预期的那样

数据表结构:

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引用的对象是否相同?