3

我想检查“名称”列下是否有任何相同的值。如果是,那么我想检查下一个相同的值是否 > 位 + 大小。我可以用 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"];
                    }
      } 
}  
4

2 回答 2

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"));
    }
}

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

于 2013-01-15T11:56:40.770 回答
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
于 2013-01-15T12:01:31.830 回答