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 に答える