Что такое коллекционная версия SingleOrDefault для словаря <T>? - PullRequest
5 голосов
/ 03 февраля 2010

Название вроде говорит само за себя. Я просто не могу найти вариант DictionaryOrDefault \ ListOrDefault \ CollectionOrDefault.

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

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

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


Думаю, мне нужно быть более ясным (хотя ответы where выглядят неплохо).

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

Ответы [ 2 ]

4 голосов
/ 03 февраля 2010

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

В противном случае вы просто смотрите на расширение IEnumerable<T>.Where(Func<T, bool> predicate) linq, которое вернет все элементы, соответствующие переданному предикату.Это вернет пустой 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;

Тогда, если выАбсолютно нужно иметь его в виде списка, вы можете просто позвонить

res.ToList();

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

1 голос
/ 03 февраля 2010

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

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

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

mylist.Any()
...