For what it's worth, this is the Linq approach:
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"));
}
}
As you can see, it's not really shorter, but probably more maintainable or readable.