比较datatable中的值,如果它们相同则更改它

时间:2013-01-15 11:31:11

标签: c# datatable compare datagridviewcolumn

我想检查列“name”下是否有相同的值。如果是,那么我想检查下一个相同的值>位+大小。我可以使用2 for循环,但我想要的是更简单的东西。 谁能告诉我怎么样?

我的数据表:

name    Bit    Size
m1      8       3
m0      9       5
m1      10      2    // Error, should be 11
m2      11      4

我的代码:

for(int i = 0; i <= Dt.Rows.Count - 1; i++)
{
    for(int y = i +1; y <= Dt.Rows.Count - 1, y++ )
      {
          if(Dt.Rows[i]["name"].ToString() == Dt.Rows[y]["Name"].ToString())
                if( (Convert.ToInt32(Dt.Rows[i]["Bit"].ToString()) + Convert.ToInt32(Dt.Rows[i]["Size"].ToString()) > (Convert.ToInt32(Dt.Rows[y]["Bit"].ToString())   ) )
                    {
                         // Show Error
                         MessageBox.Show("Error");
                         Dt.Rows[y]["Bit"] = Dt.Rows[i]["Bit"];
                    }
      } 
}  

2 个答案:

答案 0 :(得分:3)

对于它的价值,这是Linq方法:

var invalidGroups = DT.AsEnumerable()
    .GroupBy(r => r.Field<string>("name"))
    .Where(g => g.Count() > 1)
    .Select(g => new { Name = g.Key, FirstRow = g.First(), Group = g })
    .Select(x => new { x.Name, x.FirstRow, x.Group, FirstSum = x.FirstRow.Field<int>("Bit") + x.FirstRow.Field<int>("Size") })
    .Where(x => x.Group.Any(r => x.FirstSum < r.Field<int>("Bit") + r.Field<int>("Size")));
foreach (var x in invalidGroups)
{
    string name = x.Name;
    DataRow referenceRow = x.FirstRow;
    var invalidRows = x.Group
        .Where(r => x.FirstSum < r.Field<int>("Bit") + r.Field<int>("Size"));
    foreach (DataRow r in invalidRows)
    {
        int sum = r.Field<int>("Bit") + r.Field<int>("Size"); // 12 instead of 11
        r.SetField("Bit", referenceRow.Field<int>("Bit"));
        r.SetField("Size", referenceRow.Field<int>("Size"));
    }
}

正如您所看到的,它并不是真的更短,但可能更易于维护或可读。

答案 1 :(得分:0)

在SQL中尝试这个

select b.name, b.bits + b.size
from Table_1 b 
where exists (select name from Table_1 a where a.name = b.name group by name having count(*) > 1)
group by b.name, b.bits + b.size
having count(*) = 1
相关问题