Tôi có phương thức trả về ILookup
. Trong một số trường hợp, tôi muốn trả lại một số ILookup
trống làm lối ra sớm. Cách tốt nhất để xây dựng một ILookup
rỗng là gì?Rỗng ILookup <K, T>
Trả lời
Ngoài các câu trả lời từ mquander và Vasile Bujac, bạn có thể tạo một lớp đơn giản, đơn giản, dễ hiểu EmptyLookup<K,E>
như sau. (Theo tôi, có vẻ không nhiều lợi ích cho việc tạo ra một toàn ILookup<K,E>
thực hiện như mỗi câu trả lời Vasile của.)
var empty = EmptyLookup<int, string>.Instance;
// ...
public static class EmptyLookup<TKey, TElement>
{
private static readonly ILookup<TKey, TElement> _instance
= Enumerable.Empty<TElement>().ToLookup(x => default(TKey));
public static ILookup<TKey, TElement> Instance
{
get { return _instance; }
}
}
Nhờ vào mquander và Vasile, nhưng tôi nghĩ việc hợp nhất hai giải pháp này là đơn giản nhất/tốt nhất. –
Bạn có thể trả về null
hoặc ngoại lệ
Nhưng bạn nên lưu ý nó trong nhận xét về lớp
Added: + Đây là rõ ràng hơn một số phương pháp mở rộng
Tôi hoàn toàn không đồng ý. Nếu một hàm trả về một ánh xạ tra cứu '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Nó không có ý nghĩa để trả về null hoặc ném một ngoại lệ, và đột nhiên phải kiểm tra nó ở khắp mọi nơi, khi nó sẽ chỉ làm việc ra khỏi hộp nếu bạn đã trở lại một tra cứu trống rỗng. – mquander
"ILookup như là một lối ra sớm" - Đây là một trường hợp điển hình khi bạn nên ném một ngoại lệ. –
Nếu bạn đặt chú thích về ngoại lệ, tất cả các nhà phát triển khác sẽ thấy nó trong phong cách. Và xử lý ngoại lệ đó. –
Không có built-in , vì vậy tôi chỉ cần viết một phương pháp mở rộng chạy một số thứ dọc theo các dòng của new T[0].ToLookup<K, T>(x => default(K));
I nghi ngờ mạnh mẽ trả về null sẽ chính xác hơn ở đây. Nó gần như không bao giờ là trường hợp mà bạn muốn trả về null từ một phương thức mà trả về một bộ sưu tập (trái với một bộ sưu tập trống.) Tôi không thể không đồng ý nhiều hơn với những người đang đề xuất điều đó.
Ngữ nghĩa của giá trị trả về cần được xem xét. Ví dụ: tìm kiếm không trả về kết quả nào sẽ trả về bộ sưu tập trống, nhưng tìm kiếm có (ví dụ) không thành công hoặc có tham số không hợp lệ sẽ trả về 'null'. –
Vâng, tìm kiếm có thông số không hợp lệ (như trong, đối số không hợp lệ cho một phương thức, tôi đoán) có lẽ nên ném. Nhưng tôi có ý nghĩa của bạn. Nó chắc chắn phổ biến rằng một phương pháp sẽ trả về một bộ sưu tập rỗng, mặc dù, và nó thường sẽ là một mớ hỗn độn để trả về null trong trường hợp đó. – mquander
Bạn thực sự đúng về ném theo lỗi. Tuy nhiên, tôi đã làm việc với các ứng dụng kinh doanh, ví dụ, một số hệ thống bên ngoài nhất định sẽ không khả dụng trong những thời điểm nhất định trong ngày; trong những trường hợp như vậy, các truy vấn và yêu cầu sẽ thất bại, nhưng nó không phải là một trường hợp "đặc biệt", vì nó được mong đợi là hành vi. –
Bạn có thể tạo một lớp đơn cho các lần tra cứu trống.
public sealed class EmptyLookup<T, K> : ILookup<T, K>
{
private static readonly EmptyLookup<T, K> _instance
= new EmptyLookup<T, K>();
public static EmptyLookup<T, K> Instance
{
get { return _instance; }
}
private EmptyLookup() { }
public bool Contains(T key)
{
return false;
}
public int Count
{
get { return 0; }
}
public IEnumerable<K> this[T key]
{
get { return Enumerable.Empty<K>(); }
}
public IEnumerator<IGrouping<T, K>> GetEnumerator()
{
yield break;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
yield break;
}
}
sau đó bạn có thể viết mã như thế này:
var x = EmptyLookup<int, int>.Instance;
Lợi ích của việc tạo ra một lớp mới là bạn có thể sử dụng "là" nhà điều hành và kiểm tra các loại bình đẳng:
if (x is EmptyLookup<,>) {
// ....
}
Tạo danh sách trống, sau đó thực thi ToLookup() trên đó, như sau:
List<Point> items = new List<Point>();
ILookup<int, int> lookup = items.ToLookup(p => p.X, p => p.Y);
Chúc may mắn!
Hoặc một cái gì đó nhiều hơn theo tinh thần của LINQ:
public static class Utility
{
public static ILookup<TKey, TElement> EmptyLookup<TKey, TElement>(Func<TKey, TKey> keySelector,
Func<TKey, TElement> elementSelector)
{
return Enumerable.Empty<TKey>().ToLookup(keySelector, elementSelector);
}
}
Tại sao ngay cả bận tâm tham gia vào các bộ chọn funcs? –
- 1. Chuyển đổi bộ <Map.Entry <K, V>> thành HashMap <K, V>
- 2. Phương pháp mở rộng đơn trên IDictionary <K, IEnumerable/IList/ICollection <V>>
- 3. ILookup so với IGrouping
- 4. Có cách nào để làm phẳng một .Net ILookup <TKey, TElement> vào Danh sách <TElement> không?
- 5. lỗi Loại phần mở rộng cho từ điển <'K, 'V>
- 6. .NET: cách hiệu quả để tạo chuỗi từ một từ điển <K,V>?
- 7. Dump một HashMap Java <K,V> vào XML và quay lại
- 8. Chúng tôi có thể lưu KeyValuePair <K,V> trong hồ sơ người dùng không?
- 9. của Windows batch tương đương với "fuser -k <folder>"
- 10. Học J/K/APL
- 11. cmd.exe/k chuyển đổi
- 12. WEKA K-Means Clustering
- 13. In các phần tử K lớn nhất trong một đống nhất định trong O (K * log (K))?
- 14. thuật toán k-core gia tăng
- 15. Cách tốt nhất để kiểm tra xem giá trị tồn tại cho một chìa khóa trong ILookup <string, string> sử dụng LINQ
- 16. Extract dòng khi Cột K là trống với AWK/Perl
- 17. Hỗ trợ \ K trong regex
- 18. .Trim() khi chuỗi rỗng hoặc rỗng
- 19. rỗng vs chuỗi rỗng trong Oracle
- 20. Đọc bảng có dấu cách = k khoảng trắng với biến k
- 21. Thuật ngữ cho tham số trống rỗng chung <,> trong C# là gì?
- 22. Tại sao Entity Framework trả về null List <> thay vì rỗng?
- 23. WPF - Làm cách nào để tôi có thể triển khai ObservableCollection <K,T> bằng khóa (như từ điển)?
- 24. Giá trị N đầu tiên của một Bản đồ <K, V> được sắp xếp theo giá trị
- 25. temp.readline() rỗng?
- 26. HttpContext.Current.User.Identity.Name rỗng
- 27. LocalBridge độ k trong Biểu đồ
- 28. php curl -k hoặc --insecure, -X
- 29. Tìm đường dẫn k-ngắn nhất?
- 30. Matlab: K-có nghĩa là clustering
gì loại là bạn sử dụng như K và T trong ILookup của bạn? –