2013-01-15 66 views
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"]; 
        } 
     } 
} 
+0

我不知道有多大你的數據庫是,但你可以使用的GroupBy(X => x.name).Count之間的(),看看在上面的1比你知道哪些名字被多次使用 – user1797792

回答

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

正如你所看到的,這不是真的更短,但可能更易於維護或可讀。

+0

感謝蒂姆,它看起來不錯,但我想要的是更短的東西:)但無論如何謝謝 –

+0

@LeVietHung:我可以使它成爲一個單行,並刪除描述/信息行:-P請注意,長度不重要,但可讀性和(與保留)效率。 –

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 
相關問題