Remove End Row

Kết quả có thể thay đổi thứ tự của các dòng không trùng nhau vì GroupBy trong LINQ không đảm bảo giữ nguyên thứ tự ban đầu.

Nếu bạn muốn giữ nguyên thứ tự của các dòng không trùng nhau, bạn có thể dùng thêm một chỉ mục để đảm bảo dữ liệu vẫn theo thứ tự gốc:

Cách giữ nguyên thứ tự

Thêm một cột Index trước khi lọc để sau đó có thể sắp xếp lại dữ liệu:

1. Thêm cột Index vào DataTable

dt.Columns.Add("Index", GetType(Integer))
For i As Integer = 0 To dt.Rows.Count - 1
    dt.Rows(i)("Index") = i
Next

2. Lọc bỏ các dòng trùng nhau nhưng giữ nguyên thứ tự

dt = dt.AsEnumerable().
     GroupBy(Function(row) String.Join(",", row.ItemArray.Take(row.ItemArray.Length - 1))).
     Where(Function(g) g.Count() = 1).
     Select(Function(g) g.First()).
     OrderBy(Function(row) row.Field(Of Integer)("Index")).
     CopyToDataTable()

Giải thích

  • Thêm cột “Index” để lưu thứ tự gốc của từng dòng.
  • row.ItemArray.Take(row.ItemArray.Length - 1): Bỏ cột “Index” khi kiểm tra trùng lặp.
  • OrderBy(Function(row) row.Field(Of Integer)("Index")): Sắp xếp lại thứ tự theo Index gốc sau khi loại bỏ dòng trùng.

Kết quả

Các dòng không trùng nhau vẫn giữ nguyên thứ tự gốc.

Bạn thử áp dụng xem có đúng yêu cầu chưa nhé!