2010-02-03 24 views
5

Loại tiêu đề nói tất cả. Tôi dường như không thể tìm thấy tùy chọn DictionaryOrDefault \ ListOrDefault \ CollectionOrDefault.Phiên bản bộ sưu tập của SingleOrDefault cho một từ điển <T> là gì?

Có phương pháp như vậy không? Nếu không làm cách nào để tôi thực hiện việc này:

MyClass myObject = MyDictionary 
    .SingleOrDefault(x => 
         { 
          if (x.Value != null) 
           return (x.Value.Id == sourceField.SrcField.Id); 
          else 
           return false; 
         }).Key; 

nếu có nhiều hơn một kết quả? (Tôi nhận được một execption vì SingleOrDefault chỉ dành cho những kết quả duy nhất (tưởng tượng điều đó!).)


Guess tôi cần phải được rõ ràng hơn (mặc dù where câu trả lời có vẻ tốt).

Tôi có tuyên bố ở trên. Tôi đã thay đổi chương trình của mình để không phải lúc nào cũng trả về 1 (có thể có nhiều giá trị khớp với một khóa). Điều đó không thành công vì vậy tôi đang tìm kiếm một bộ sưu tập được trả về (chứ không phải chỉ là một mục).

+0

nhỏ làm rõ ở đây, bạn đang cố gắng để có được nhiều giá trị mà phù hợp với một vị từ, hoặc chỉ một, bất kể nó là gì? –

+1

"Tiêu đề loại nói tất cả." Không thực sự, ý bạn là gì bởi 'DictionaryOrDefault'? Vui lòng chỉ định ngữ nghĩa dự kiến ​​một cách cẩn thận, rõ ràng và chính xác. – jason

+1

vì vậy những gì bạn muốn là cái gì đó trả về null nếu không có gì phù hợp, hoặc một danh sách nếu một hoặc nhiều không? –

Trả lời

4

Bạn có thể sử dụng IEnumerable<T>.FirstOrDefault(Func<T, bool> predicate) nếu ý định của bạn là trả lại giá trị đầu tiên khớp với biến vị ngữ.

Nếu không, bạn chỉ cần xem phần mở rộng LINQ IEnumerable<T>.Where(Func<T, bool> predicate), sẽ trả về tất cả các phần tử khớp với biến vị ngữ được chuyển. Điều đó sẽ trả lại một rỗng IEnumerable<T> nếu không có phần tử nào phù hợp với vị từ, tại thời điểm đó nếu bạn thực sự cần giá trị là rỗng, bạn có thể chỉ cần tìm xem có bất kỳ thứ gì trong đó không.

var res = MyDictionary.Where(x => 
         { 
          if (x.Value != null) 
           return (x.Value.Id == sourceField.SrcField.Id); 

          return false; 
         }); 
if (!res.Any()) 
    res = null; 

Sau đó, nếu bạn absolutly cần phải có nó như là một danh sách, bạn chỉ có thể gọi

res.ToList(); 

Lưu ý rằng nếu bạn đang thực sự thao tác một Dictionary<TKey, TValue>, res sẽ chứa KeyValuePair<TKey, TValue> 's.

+0

Tôi cảm thấy khá câm vì không nghĩ đến đâu. Tôi chỉ bị xoắn xung quanh. – Vaccano

1

nếu bạn làm điều gì đó như

var mylist = obj.Where(x=>x.attr1 == 4); 

sau đó bạn có thể kiểm tra nếu bất cứ điều gì được trả lại bằng cách sử dụng phương pháp Bất cứ()

mylist.Any() 
+0

Đừng gọi .ToList() cho đến khi bạn cần. Ngay cả khi bạn biết bạn cần nó ngay lập tức, ít nhất là lưu nó cho dòng tiếp theo. –

+0

Tôi sẽ nhớ rằng trong thời gian tới, cảm ơn thông tin. –

+0

@ Jelel - Có hạn chế gọi ToList không? (Tôi đã giả định như vậy, nhưng không bao giờ biết ...) – Vaccano

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