Bạn sẽ cần phải làm một bản sao, nhưng điều này có lẽ là một điều tốt. Trong C# 2, mã hiện tại của bạn gần như là sạch nhất mà bạn có thể thực hiện. Nó sẽ được cải thiện bằng cách trực tiếp xây dựng danh sách của bạn giảm giá trị của bạn (List<MyType> list = new List<MyType>(valueCollection);
), nhưng vẫn cần một bản sao.
Sử dụng LINQ với C# 3, tuy nhiên, bạn sẽ có thể làm:
myDictionary.Values.ToList();
Điều đó đang được nói, tôi sẽ không (có lẽ) cố gắng tránh các bản sao. Việc trả lại bản sao các giá trị của bạn có xu hướng an toàn hơn vì nó ngăn người gọi gây ra sự cố nếu họ cố sửa đổi bộ sưu tập của bạn. Bằng cách trả lại một bản sao, người gọi có thể làm list.Add(...)
hoặc list.Remove(...)
mà không gây ra sự cố về lớp học của bạn.
Edit: Với nhận xét của bạn dưới đây, nếu tất cả các bạn muốn là một IEnumerable<T>
với Count, bạn chỉ có thể trở lại ICollection<T>
. này được thực hiện trực tiếp bởi ValueCollection
, có nghĩa là bạn chỉ có thể trả về giá trị của từ điển của bạn trực tiếp, không có sao chép:
private ICollection<MyType> ConvertToList(Dictionary<int, MyType>.ValueCollection valueCollection)
{
return valueCollection;
}
(Cấp, phương pháp này trở nên thực sự vô dụng trong trường hợp này - nhưng tôi muốn chứng tỏ nó cho bạn ...)
Nguồn
2010-03-29 19:12:19
Mọi giải pháp được đăng cho đến nay liên quan đến việc sao chép toàn bộ bộ sưu tập. **Đọc câu hỏi**. – SLaks
@SLaks: Tôi đã giải quyết trực tiếp câu trả lời của tôi ... (vẫn liên quan đến việc sao chép) –
Có bất kỳ sự liên quan nào đối với keyType "int" hay là loại tùy ý không? –