cách nào để thực hiện điều này trong C#?Chuyển đổi từ Mảng sang ICollection <T>
Trả lời
Mảng T được gán cho ICollection of T, vì một mảng T thực hiện IList của T. IList của T mở rộng ICollection of T, vì vậy bạn có thể chỉ định một mảng cho ICollection.
class Foo {}
Foo [] foos = new Foo [12];
ICollection<Foo> foo_collection = foos;
Bạn có nói rằng, về cơ bản, không cần phải * chuyển đổi * vì Array đã * là * một ICollection? –
Ngoài các câu trả lời và nhận xét, nếu bạn muốn đi cách khác, bạn sử dụng phương pháp ToArray()
trên IEnumerable<T>
(mà ICollection<T>
xuống từ).
Câu trả lời ngắn:
Sử dụng ToList(). Đừng dựa vào số T[]
có thể được gán cho ICollection<T>
trừ khi bạn biết những điều sau và biết bạn đang làm gì.
Nếu bạn cần chỉ đọc, tốt hơn nên sử dụng Array.AsReadOnly(T[])
và tránh sao chép thêm, đồng thời tránh các sự cố được nêu chi tiết bên dưới.
câu trả lời chi tiết:
Mặc dù mảng của T (. Tức là T[]
) kỹ thuật thực hiện IList<T>
(và ICollection<T>
và IEnumerable<T>
), nó không thực sự thực hiện toàn bộ IList<T>
và ICollection<T>
giao diện , như đã đề cập in the documentation:
... Điều quan trọng cần lưu ý khi bạn truyền một mảng tới một trong các giao diện này là các thành viên thêm, chèn hoặc loại bỏ các phần tử ném
NotSupportedException
.
Nói cách khác, nếu bạn chỉ truyền mảng đến ICollection<T>
, bạn sẽ nhận được NotSupportedException
ngay khi bạn gọi bất kỳ phương pháp nào nói trên.
Vì vậy, cách tốt nhất để chuyển đổi một mảng an toàn một ICollection<T>
sẽ là để tạo ra một đối tượng mới, chẳng hạn như sử dụng Linq
's ToList()
:
T[] array;
// Will create a new list based on the current contents of the array
ICollection<T> collection = array.ToList();
Đây là câu trả lời tốt hơn nhiều, chấp nhận không thực sự đề cập đến "nguy hiểm" của việc đúc chúng mà không cần quan tâm. –
Vì vậy, nếu tôi biết tôi sẽ không sửa đổi bộ sưu tập ở tất cả, nó là an toàn để đúc ICollection
@DanielLorenz nếu bạn muốn nó là chỉ đọc, nó tốt hơn để thực thi nó với ['Array.AsReadOnly (T [])'] (https://docs.microsoft.com/en-us/dotnet/api/system. array.asreadonly? view = netframework-4.7 # System_Array_AsReadOnly__1 ___ 0___) – sinelaw
- 1. Stack <T> thực hiện ICollection, nhưng có phương pháp từ ICollection <T>
- 2. chuyển đổi truy vấn LINQ to ICollection
- 3. LINQ chuyển đổi từ điển <key,value> sang từ điển <value,key>
- 4. ICollection <string> thành chuỗi []
- 5. danh sách <int> chuyển đổi sang int []
- 6. Lua: chuyển đổi từ phao sang int
- 7. Chuyển từ điển sang danh sách <KeyValuePair>
- 8. Chuyển đổi System.Drawing.Image sang Emgu.CV.Image <Gray,byte>
- 9. Chuyển đổi IEnumerable <T> sang IList
- 10. Chuyển đổi từ điển <String,Int> sang từ điển <String, SomeEnum> bằng LINQ?
- 11. Chuyển đổi hình ảnh sang một mảng RGB trong Javascript
- 12. Chuyển đổi XML sang CSV bằng Javascript
- 13. Chuyển đổi từ BitArray sang Byte
- 14. chuyển đổi từ EST/EDT sang GMT
- 15. Chuyển đổi từ IEnumerable sang Danh sách
- 16. Chuyển đổi từ mod_python sang mod_wsgi
- 17. Cách chuyển đổi từ markdown sang pdf
- 18. Chuyển đổi từ RGB int sang Hex
- 19. Chuyển đổi từ Mercurial sang Subversion
- 20. Chuyển đổi sang Luồng từ Url
- 21. Python: Chuyển đổi từ `datetime.datetime` sang` time.time`
- 22. Chuyển đổi từ C++ sang Java
- 23. Loại Chuyển đổi từ C sang Java
- 24. Chuyển đổi sang và từ lịch Hindu
- 25. Chuyển đổi từ IplImage * sang cv :: MAT
- 26. Chuyển đổi từ nguyên mẫu sang jQuery
- 27. chuyển đổi html sang hình ảnh trong byte mảng java
- 28. Chuyển đổi mảng int32 sang byte trong go
- 29. Gson - chuyển đổi từ Json sang kiểu ArrayList <T>
- 30. Làm thế nào để chuyển đổi từ điển <> sang Hashtable trong C#?
Không có chuyển đổi, một loạt các dụng cụ T ICollection. –
Thorarin
Mảng không thực hiện 'ICollection' an toàn - xem [answer] (http://stackoverflow.com/a/12100850/562906). –
sinelaw