2011-07-25 17 views
19

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>

+0

gì loại là bạn sử dụng như K và T trong ILookup của bạn? –

Trả lời

37

Ngoài các câu trả lời từ mquanderVasile 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; } 
    } 
} 
+0

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. –

-1

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

+4

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

+0

"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ệ. –

+0

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ệ đó. –

18

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 đó.

+0

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'. –

+3

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

+0

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. –

7

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<,>) { 
// .... 
} 
+0

Đây có lẽ là câu trả lời hay nhất, nói đúng. – mquander

+0

Cảm ơn, có vẻ tốt. Tôi sẽ đề nghị rằng [] nên ném KeyNotFoundException hơn là NotImplementedException. –

+0

Vâng, bạn nói đúng, cảm ơn. Tôi đã chỉnh sửa bài viết của mình – Vasea

1

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!

-1

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); 
    } 

} 
+0

Tại sao ngay cả bận tâm tham gia vào các bộ chọn funcs? –

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