我有一個數據表,它有一個單一的文本列「標題」,它可以有多個重複的值。我可以使用數據視圖刪除重複項。從數據表中獲取每個不同值的重複計數
DataView v = new DataView(tempTable);
tempTable = v.ToTable(true, "Title");
但是我怎樣才能得到沒有任何循環的每個不同值的重複次數?
我有一個數據表,它有一個單一的文本列「標題」,它可以有多個重複的值。我可以使用數據視圖刪除重複項。從數據表中獲取每個不同值的重複計數
DataView v = new DataView(tempTable);
tempTable = v.ToTable(true, "Title");
但是我怎樣才能得到沒有任何循環的每個不同值的重複次數?
如果你不想循環或使用Linq,所以沒有辦法做到這一點,但是如果適用於你,你可以在數據表上使用一個計算列。這是數據應該在這樣的兩個相關表中。
DataRelation rel = new DataRelation("CustToOrders", data.Tables["Customers"].Columns["customerid"], data.Tables["Orders"].Columns["customerid"]);
data.Relations.Add(rel);
鑑於customerid字段作爲Orders表中的外鍵,因此它具有重複項。 你可以這樣得到重複次數:
data.Tables["Customers"].Columns.Add("Duplicates",
GetType(Decimal), "Count(child.customerid)");
的方式,我會得到你想要看起來像這樣的結果:
tempTable.Rows.Cast<DataRow>()
.Select(dr => Convert.ToString(dr[0]))
.GroupBy(dr => dr)
.Select(g => new { Title = g.Key, Count = g.Count() });
但是,它實際上是引擎蓋下循環。事實上,我無法想象如何在不檢查每條記錄的情況下進行這種分組。
缺點是該表達式的結果是一系列匿名類型實例。如果您仍然希望結果是DataView,那麼您可以重寫最後一個Select以創建具有兩列的新DataRow,並將它們推送到傳遞給DataView的新DataTable中。
我不幸地使用Linq。 – NLV 2010-08-08 14:54:13
你可以用'tempTable.AsEnumerable()'替換'tempTable.Rows.Cast()' –
2010-08-09 11:58:35