DataTable 对我实现的逻辑没有反应

问题描述 投票:0回答:1

我一直在尝试在数据表上实现逻辑来查找并消除孤立行。如果记录的单元格 26 中的数字未反映在表的任何单元格 21 中,则该行被视为孤立行并应被删除。我不明白为什么我的代码不起作用:

DataTable t = Session["SessionData"] as DataTable;
DataRow[] rows = t.Select();
int occurance;
int n = 0;
string Orphan = "";
for (int i = 0; i < rows.Length; i++)
{
    if(rows[i][26].ToString() != "0")//An additional condition that shouldn't affect
    {
        occurance = 0;
        for (int j = 0; j < rows.Length; j++)
        {
            if (j != i)
            {
                n = i;
                if (rows[i][26].ToString() == rows[j][21].ToString())
                {
                    occurance = 1;
                    break;
                }
            }
        }
        if(occurance == 0)
        {
            Orphan = rows[n][26].ToString();
            t.Rows[n].Delete();
            t.AcceptChanges();
            Session["SessionData"] = t;
            break;
        }
    }
}
if(!string.IsNullOrEmpty(Orphan))
{
    ClearOrphans(null, null);
}

为了避免数据表索引中的不一致,我只执行一次删除操作,将数据保存到会话参数中,然后重新启动相同的例程,直到没有检测到孤立行。该代码甚至似乎没有进入

if(occurance == 0)
条件

c# datatable
1个回答
0
投票

好吧,修复这个“意大利面条代码”很困难,也许更简单的 LINQ 解决方案会有所帮助:

var cell21Values = t.AsEnumerable().Select((r,ix) => (Index:ix, Value:r.Field<int>(21)));
var cell26Values = t.AsEnumerable().Select((r,ix) => (Index:ix, Value:r.Field<int>(26), Row:r));
var orphaned = cell26Values
    .Where(x26 => !cell21Values.Any(x21 => x21.Index != x26.Index && x21.Value == x26.Value))
    .ToList();
orphaned.ForEach(x26 => x26.Row.Delete());
t.AcceptChanges();
© www.soinside.com 2019 - 2024. All rights reserved.