2010-02-03 10 views
5

Tytułowy tytuł mówi wszystko. Po prostu nie mogę znaleźć opcji.Co to jest wersja kolekcji SingleOrDefault dla słownika <T>?

Czy istnieje taka metoda? Jeśli nie, jak to zrobić:

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

jeśli jest więcej niż jeden mecz? (Dostaję execption ponieważ SingleOrDefault jest przeznaczona tylko dla pojedynczych wyników (wyobrazić, że!).)


Guess muszę być jaśniejszy (choć where odpowiedzi wygląda dobrze).

Mam powyższe oświadczenie. Zmieniłem program tak, aby nie zawsze zwracał 1 (może być kilka wartości pasujących do jednego klawisza). To się nie udaje, więc szukam kolekcji, która ma zostać zwrócona (a nie tylko jeden przedmiot).

+0

Małe wyjaśnienie tutaj, starasz się uzyskać wiele wartości, które dopasować predykat, lub tylko jeden, w zależności od tego, który jest? –

+1

"Tytułowy rodzaj mówi wszystko." Niezupełnie, co masz na myśli przez 'DictionaryOrDefault'? Proszę dokładnie i wyraźnie określić oczekiwaną semantykę. – jason

+1

, więc to, czego chcesz, to coś, co zwraca zero, jeśli nic nie pasuje, lub listę, jeśli jeden lub więcej ma? –

Odpowiedz

4

Możesz użyć IEnumerable<T>.FirstOrDefault(Func<T, bool> predicate), jeśli masz zamiar zwrócić pierwszą pasującą do predykatu.

W przeciwnym razie po prostu patrzysz na rozszerzenie linq IEnumerable<T>.Where(Func<T, bool> predicate), które zwróci wszystkie elementy pasujące do przekazanego predykatu. To zwróci pusty IEnumerable<T>, jeśli żadne elementy nie pasują do predykatu, w którym to momencie, jeśli naprawdę potrzebujesz wartości, która ma być zerowa, możesz po prostu sprawdzić, czy coś jest w niej.

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

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

Następnie, jeśli absolutnie trzeba mieć je w postaci listy, można po prostu zadzwonić

res.ToList(); 

Zauważ, że jeśli faktycznie manipulowania Dictionary<TKey, TValue>, res będzie zawierał KeyValuePair<TKey, TValue> „s.

+0

Czuję się całkiem głupio, nie myśląc o Dokąd. Właśnie się przekręciłem. – Vaccano

1

jeśli robisz coś

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

można następnie sprawdzić, czy wszystko zostało zwrócone stosując metodę .Any()

mylist.Any() 
+0

Nie wywoływać funkcji .ToList(), dopóki jej nie potrzebujesz. Nawet jeśli wiesz, że potrzebujesz go od razu, przynajmniej zachowaj go dla następnej linii. –

+0

Zapamiętam to na następny raz, dzięki za informację. –

+0

@Joel - czy są jakieś wady wywoływania ToList? (Przyjąłem, że tak, ale nigdy nie wiedziałem ...) – Vaccano