我一直在尝试在数据表上实现逻辑来查找并消除孤立行。如果记录的单元格 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)
条件
好吧,修复这个“意大利面条代码”很困难,也许更简单的 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();