2010-02-03 1 views
5

Название типа говорит все. Я просто не могу найти DictionaryOrDefault \ ListOrDefault \ CollectionOrDefault.Что такое коллекционная версия SingleOrDefault для словаря <T>?

Есть ли такой способ? Если нет, то как это сделать:

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

если есть несколько совпадений? (Я получаю execption потому что SingleOrDefault предназначен только для отдельных результатов (представьте себе!).)


Guess мне нужно быть более ясным (хотя where ответы выглядит хорошо).

У меня есть вышеуказанное утверждение. Я изменил свою программу, чтобы она не всегда возвращала 1 (может быть несколько значений, соответствующих одному ключу). Это не удается, поэтому я ищу коллекцию, которая будет возвращена (а не только один элемент).

+0

Немного уточнение здесь, вы пытаетесь получить много значений, соответствовать предикату или только одному, в зависимости от того, что это такое? –

+1

«Типичный вид говорит все». Не совсем, что вы подразумеваете под «DictionaryOrDefault»? Просьба указать ожидаемую семантику тщательно, четко и правильно. – jason

+1

, так что вы хотите, это то, что возвращает null, если ничего не соответствует, или список, если один или несколько? –

ответ

4

Вы можете использовать IEnumerable<T>.FirstOrDefault(Func<T, bool> predicate), если вы намереваетесь вернуть первый, соответствующий предикату.

В противном случае вы просто смотрите на расширение linq IEnumerable<T>.Where(Func<T, bool> predicate), которое вернет все элементы, соответствующие прошедшему предикату. Это вернет пустой IEnumerable<T>, если никакие элементы не соответствуют предикату, и в этот момент, если вам действительно нужно, чтобы значение было нулевым, вы можете просто посмотреть, что-нибудь в нем.

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

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

Затем, если вы Absolutly должны иметь его в виде списка, вы можете просто позвонить

res.ToList(); 

Обратите внимание, что если вы на самом деле манипулирования Dictionary<TKey, TValue>, res будет содержать KeyValuePair<TKey, TValue> «с.

+0

Я чувствую себя совершенно немым, не думая о Где. Я просто перевернулся. – Vaccano

1

если вы делаете что-то вроде

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

, то вы можете проверить все, что было возвращено с использованием метода .any()

mylist.Any() 
+0

Не вызывайте .ToList(), пока это не понадобится. Даже если вы знаете, что вам нужно это сразу, по крайней мере, сохраните его для следующей строки. –

+0

Я запомню это в следующий раз, спасибо за информацию. –

+0

@Joel - Есть ли недостатки, вызывающие ToList? (Я так предположил, но никогда не знал ...) – Vaccano

Смежные вопросы