Лямбда "если" выражение?

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

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

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

", если i.name существует, тогда установите id в i.name, иначе установите id в i.inner.name".

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

Обновление

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

Ответ 1

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

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

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

Ответ 2

Если это два разных типа (ссылочных), вы можете их протестировать с помощью 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;
     }

Ответ 3

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

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

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

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

Ответ 4

что-то вдоль линий

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

(untested) должен делать трюк, если i.name не является нулевым (пустая строка) или

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

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

Ответ 5

в качестве встроенного запроса, я бы использовал троичный оператор, так:

(i.name != null ? set id to i.name : set id to i.inner.name)