Làm cách nào để xóa các DataRows cụ thể trong vòng lặp của một hàng DataTable đáp ứng các điều kiện tùy chỉnh cho biết các hàng có chỉ số thậm chí là số không? (Nếu không sử dụng LINQ)Làm thế nào để xóa nhiều hàng trong một DataTable?
Cảm ơn
Làm cách nào để xóa các DataRows cụ thể trong vòng lặp của một hàng DataTable đáp ứng các điều kiện tùy chỉnh cho biết các hàng có chỉ số thậm chí là số không? (Nếu không sử dụng LINQ)Làm thế nào để xóa nhiều hàng trong một DataTable?
Cảm ơn
Nó phụ thuộc vào những gì bạn có nghĩa là bởi 'xóa'.
Nếu bạn muốn đánh dấu chúng là đã xóa, chỉ cần gọi phương thức Delete()
trên mỗi hàng khi bạn truy cập nó trong vòng lặp của mình. Sau đó, bạn cần gọi số AcceptChanges()
trên bảng dữ liệu để hoàn tất việc xóa - có lẽ sau khi bạn cập nhật cơ sở dữ liệu của mình (nếu có).
foreach(DataRow row in someTable.Rows)
{
if(/* your condition here */)
row.Delete();
}
someTable.AcceptChanges();
Nếu bạn có nghĩa là loại bỏ nó khỏi các DataTable, sau đó bạn cần phải làm như vậy trong hai đèo:
List<DataRow> rowsToDelete = new List<DataRow>();
foreach(DataRow row in someTable.Rows)
{
if(/* your condition here */)
{
rowsToDelete.Add(row);
}
}
foreach(DataRow row in rowsToDelete)
{
someTable.Rows.Remove(row);
}
Đó là giá trị chỉ ra rằng bạn luôn có thể sử dụng phương pháp đầu tiên để loại bỏ hàng - vì việc đánh dấu các hàng là Deleted
và sau đó chấp nhận thay đổi sẽ tự động xóa chúng khỏi bảng. Tuy nhiên, đôi khi việc xóa các đối tượng DataRow
rõ ràng và hiệu quả hơn từ bộ sưu tập Rows
.
Hãy thử một cái gì đó giống như ví dụ này
DataTable table = new DataTable();
table.Columns.Add("Foo",typeof(int));
for (int i = 0; i < 10; i++)
table.Rows.Add(i);
for (int i = table.Rows.Count -1; i >=0; i--)
{
// sample removes all even foos
if ((int)table.Rows[i]["Foo"] % 2 == 0)
table.Rows.RemoveAt(i);
}
thử lặp lại kết quả của Chọn(). Điều này là khá tương tự như câu trả lời khác, nhưng tôi thấy nó trực tiếp nhất
DataRow[] r = table.Select();
for (int i = 0; i < r.Length; i++)
{
if (i % 2 == 0)
r[i].Delete();
}
thử
foreach(DataRow oRow in YourDataTable.Rows)
{
if ("Check You Condition")
{
YourDataTable.Rows.Remove(oRow);
}
}
Bạn không thể sửa đổi bộ sưu tập trong khi lặp qua bộ sưu tập với vòng lặp foreach. –
Một cách khác đây là
DataRow[] DrArrCheck = DataTableName.Select("ID > 0");
foreach(DataRow DrCheck in DrArrCheck)
{
DataTableName.Rows.Remove(DrCheck);
}
public static void DeleteRowsFromDataTable(DataTable dataTable, string columnName, string columnValue)
{
IEnumerable<DataRow> dataRows = (from t in dataTable.AsEnumerable()
where t.Field<string>(columnName) == columnValue
select t);
foreach (DataRow row in dataRows)
dataTable.Rows.Remove(row);
}
Đây là cách tôi đã làm khi tôi gặp phải vấn đề này.
Dim index As Integer = 0
Dim count As Integer = resultsDT.Rows.Count - 1
For i As Integer = 0 To count
If resultsDT.Rows(index).Item("something") = "something" Then
resultsDT.Rows(index).Delete()
resultsDT.AcceptChanges()
index = index - 1
End If
index = index + 1
i = i + 1
Next
tôi luôn luôn sử dụng "hai giai đoạn" cách tiếp cận LBushkin và cuối cùng tôi quyết định nó là giá trị nó để viết một hàm cho nó:
public delegate bool DataRowComparer(DataRow dr);
public static void RemoveDataRows(DataTable table, DataRowComparer drc)
{
List<DataRow> RowsToRemove = new List<DataRow>();
foreach (DataRow dr in table.Rows)
if (drc(dr))
RowsToRemove.Add(dr);
foreach (DataRow dr in RowsToRemove)
table.Rows.Remove(dr);
}
Và bây giờ tôi có thể xóa hàng với một dòng mã (ví dụ):
RemoveDataRows(dt, row => row["StringVal"].ToString() == "B" && (Int16)(row["NumberVal"]) >= 4);
Trong trường hợp này giúp bất cứ ai ...
(Và cách nào để furthe r viết tắt được đánh giá cao.)
Nếu bạn muốn có một giải pháp ngắn hơn so với những đề xuất ở trên, hãy thử Looping trên danh sách kết quả, và sử dụng một lambda như sub(x)
để loại bỏ mỗi người hàng.
dt.Select("Column1 > 0").ToList.ForEach(Sub(x) dt.Rows.Remove(x))
Để xóa nhiều hàng (ví dụ 50.000 trong số 100.000) sao chép cơ sở dữ liệu nhanh hơn nhiều so với việc thực hiện cả dữ liệu.Rows.Remove (hàng) hoặc hàng.Delete(). Ví dụ:
DataRow[] rowsToKeep = datatable.Select("ID > 50000");
DataTable tempDataTable= rowsToKeep.CopyToDataTable;
dataTable.Clear();
dataTable.Merge(tempDataTable);
tempDataTable.Dispose();
+1 cho lời giải thích tuyệt vời này, là đáng lo ngại chút với điều này !! – Jithu
Nếu bạn làm giống như những gì LBushkin đã nói, bạn sẽ thấy như sau: Bộ sưu tập đã được sửa đổi; hoạt động liệt kê có thể không thực hiện được. vì vậy nó sai. – Szjdw
Miễn là bạn gọi .AcceptChanges() trước khi đánh dấu các hàng là đã xóa (trước vòng lặp foreach) thì bạn sẽ không nhận được thông báo "Bộ sưu tập đã được sửa đổi, liệt kê có thể không thực thi". Lỗi xuất hiện vì có các thay đổi đang chờ xử lý cần phải được chấp nhận. Nếu bạn sử dụng vòng lặp for thì nó sẽ không thành vấn đề, nhưng trong trường hợp đó, tốt nhất là nên lặp lại. – Soenhay