Какова версия набора SingleOrDefault для Словаря <T>?

В заголовке отчасти говорится все это. Я просто, может казаться, не нахожу a DictionaryOrDefault \ ListOrDefault \ CollectionOrDefault опция.

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

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

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


Угадайте, что я должен был быть более ясным (хотя where ответы выглядят хорошими).

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

5
задан Vaccano 3 February 2010 в 03:51
поделиться

2 ответа

Вы можете использовать IENumerable .firstordefault (func Предикат) Если ваше намерение вернуть первый, соответствующий предикату.

В противном случае вы просто смотрите в IEnumerable . Где (FUNC Predicate) Расширение LINQ, который вернет все элементы, которые соответствуют прошедшему предикату. Это вернет пустой IEnumerable , если никаких элементов совпадает с предикатом, в какой момент, если вам действительно нужно значение, чтобы быть нулевым, вы можете просто посмотреть, если что-нибудь в нем.

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

Обратите внимание, что если вы на самом деле манипулируете словарь , RES будет содержать keyvaluepair .

4
ответ дан 14 December 2019 в 19:12
поделиться

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

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

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

mylist.Any()
1
ответ дан 14 December 2019 в 19:12
поделиться