Лямбда, “если” оператор?

У меня есть 2 объекта, оба из которых я хочу преобразовать в словари. Я использую toDictionary <> ().

Лямбда-выражение для одного объекта получить ключ (я => i.name). Для другого это (я => i.inner.name). Во втором не существует i.name. i.inner.name ВСЕГДА существует, если i.name не делает.

Существует ли лямбда-выражение, которое я могу использовать для объединения этих двух? В основном читать как:

"если i.name существует затем идентификатор набора к i.name, еще идентификатор набора к i.inner.name".

Большое спасибо.

Обновление

Когда я говорю, "не существуют", я подразумеваю, что объекты на самом деле не имеют свойств, не, что свойства являются просто пустыми.

10
задан AndrewC 19 March 2010 в 11:05
поделиться

4 ответа

Почему бы вам не дать каждому объекту собственный метод ToDictionary , поскольку в этом случае они, очевидно, имеют собственное поведение.

Если вы не можете добавлять объекты, потому что не владеете ими, вы всегда можете написать для них методы расширения.

Есть ли причина, по которой вы пытаетесь принудительно передать их в одну "обычную" функцию?

4
ответ дан 3 December 2019 в 18:32
поделиться

Если это два разных (ссылочных) типа, то вы можете проверить их с помощью ключевых слов is или as -

i => {
         var x = i as TypeThatHasNameProperty;
         return (x != null) ? x.name : i.inner.name;
     }

Если вы не можете проверить конкретные типы, то вы можете использовать отражение для проверки самого свойства name:

i => {
         var pi = i.GetType().GetProperty("name");
         return (pi != null) ? pi.GetValue(i, null) : i.inner.name;
     }
14
ответ дан 3 December 2019 в 18:32
поделиться

Да, условный оператор («тернарный оператор») делает то, что вы хотите:

(i => i.name != null ? i.name : i.inner.name)

Предполагая, конечно, что вы можете обнаружить «существование» имени путем проверки на null .

Править : В этом случае ответ Киршштейна, конечно, лучше.

3
ответ дан 3 December 2019 в 18:32
поделиться

что-то вроде

collection1.ForEach(i => myDictionary.Add((i.name.length == 0 ? i.inner.name : i.name),value);

(не проверено) должно сработать, если i.name не null (пустая строка), или

collection1.ForEach(i => myDictionary.Add((i.name ?? i.inner.name),value);

(тоже не проверено)

0
ответ дан 3 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: