2012-03-10 29 views
13

Làm cách nào tốt nhất để làm điều đó.Bản sao nông sản của một băm nhỏ

HashSet<reference_type> set2 = new HashSet<reference_type>(); 

Di chuyển bộ này bằng thiết bị như thế này?

foreach (var n in set) 
    set2.Add(n); 

Hoặc sử dụng thứ gì đó giống như thế này?

chunk2 = chunk.UnionWith(chunk); // all the elements 

Trả lời

20

Sử dụng các constructor:

HashSet<type> set2 = new HashSet<type>(set1); 

Cá nhân tôi muốn LINQ to Objects đã có một phương pháp ToHashSet phần mở rộng như nó cho ListDictionary. Thật dễ dàng để tạo riêng của bạn về khóa học:

public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source) 
{ 
    if (source == null) 
    { 
     throw new ArgumentNullException("source"); 
    } 
    return new HashSet<T>(source); 
} 

(Với một tình trạng quá tải khác cho một comparer bình đẳng tùy chỉnh.)

này làm cho nó dễ dàng để tạo bộ một loại vô danh.

4

Đây có lẽ là dễ nhất và tốt nhất:

HashSet<int> s = new HashSet<int>{1,2,3}; 

HashSet<int> t = new HashSet<int>(s); 

Từ MSDN docs:

HashSet<T>(IEnumerable<T> collection) 

Khởi một trường hợp mới của lớp HashSet sử dụng comparer bình đẳng mặc định cho các thiết lập loại, chứa các phần tử được sao chép từ bộ sưu tập được chỉ định và có đủ công suất để chứa số lượng đã sao chép các phần tử.

10

tốt nhất là chủ quan, nhưng tôi muốn làm điều đó như sau:

set2 = new HashSet<type>(set); 

Hoặc thậm chí tốt hơn:

set2 = new HashSet<type>(set, set.Comparer); 

đảm bảo bạn đang sử dụng comparer bình đẳng giống như bản gốc HashSet. Ví dụ: nếu bản gốc không phân biệt chữ hoa chữ thường HashSet<string>, chữ cái mới của bạn cũng sẽ phân biệt chữ hoa chữ thường.

Các vấn đề liên quan