Nếu bạn có thể làm khác biệt tại chỗ, bạn có thể làm điều đó rất nhanh chóng và với số không phân bổ bằng cách đầu tiên sử dụng Array.Sort
và sau đó:
TSource oldV = source[0];
int pos = 1;
for (int i = 1; i < source.Count; i++)
{
var newV = source[i];
source[pos] = newV;
if (!eqComparer.Equals(newV, oldV))
{
pos++;
}
oldV = newV;
}
//pos now == the new size of the array
Sau đó bạn sẽ phải tiếp tục theo dõi những kích thước hiện nay nhỏ hơn mảng, hoặc sử dụng Array.resize (Nhưng điều đó sẽ phân bổ một mảng mới)
Hoặc nếu bạn thực hiện cách tiếp cận tương tự này với List<T>
, bạn có thể gọi RemoveRange
ở cuối để thay đổi kích thước mà không phân bổ. Điều này kết thúc nhanh hơn đáng kể.
Các áp phích khác có thể là chính xác mặc dù bạn có thể đạt được mục tiêu này một cách khác, chẳng hạn như sử dụng một bộ băm ở vị trí đầu tiên hoặc giữ các bộ sưu tập song song trong đó chỉ chứa các phần tử riêng biệt. Bù đắp chi phí nhỏ trên chèn/loại bỏ vì vậy mà không có thời gian ở tất cả là cần thiết để có được bộ khác biệt.
Nó sẽ giúp bạn có nhiều nền tảng hơn ... – soandos
Bạn cần thêm chi tiết - bạn có kiểm soát cách danh sách được tạo không? Bạn có thể làm tốt hơn nếu bạn không bao giờ chèn các phần tử trùng lặp vào danh sách ở vị trí đầu tiên ... –
'.Distinct' _is_ nhanh hơn. Bạn đã lược tả chưa? – SLaks