2015-06-25 16 views
15

Tôi có một Danh sách có các đối tượng trùng lặp. Để giải quyết điều đó, tôi cần chuyển đổi List thành một HashSet (trong C#). Có ai biết làm thế nào?Làm thế nào để chuyển đổi Danh sách <T> thành HashSet <T> trong C#?

+1

Đây là danh sách, không phải là mảng. – qazwsxedcrfvtgbyhnujmikolp

+1

Đối với loại câu hỏi này, cả hai đều là 'IList '. – Richard

+0

Câu trả lời giải quyết vấn đề— "HashSet có một hàm tạo có một IEnumerable". –

Trả lời

2

Một cách khác sẽ

var yourlist = new List<SomeClass>(); 

// [...] 

var uniqueObjs = yourlist.Distinct(); //Gives you a List with unique Objects of the List. 

Lưu ý rằng đây chỉ là có thể, nếu SomeClass ghi đè GetHashCodeEquals một cách nào đó. Điều này cũng đúng đối với

var uniqueObjs = new HashSet<SomeType>(yourOriginalList); 

Nếu không, bạn có thể triển khai riêng bạn IEqualityComnparer -class và chuyển nó thành riêng biệt.

Lưu ý rằng với cách tiếp cận Distinct(), bạn cũng có thể tìm kiếm giá trị tài sản riêng biệt của đối tượng trong danh sách:

var uniqueNames = yourlist.Select(obj => obj.Name).Distinct(); 

và một số chi tiết ...

+0

Tôi thích câu trả lời này cho câu trả lời cho câu hỏi cụ thể. "Tôi muốn một ngôi nhà có 2 cánh cửa, vì vậy tôi sẽ làm căn nhà này với 1 cửa và xây một căn nhà mới từ đầu" – Phylogenesis

+1

bạn sẽ cần phải thực hiện IEquatable trên 'SomeClass' để làm việc đó – Yohannes

+0

@YTAM theo như tôi lo ngại, đây cũng là trường hợp nếu bạn muốn tạo một Hashset mới dựa trên danh sách gốc. – nozzleman

2

Nếu loại của bạn thực hiện IEquatable<T>, Equals()GetHashCode() chính xác, sau đó bạn không cần phải tự mình sao chép. Bạn có thể sử dụng số Distinct() của Linq để làm như vậy:

myList = myList.Distinct().ToList(); 
Các vấn đề liên quan