Лямбда "если" заявление? - PullRequest
10 голосов
/ 19 марта 2010

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

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

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

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

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

Обновление

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

Ответы [ 5 ]

14 голосов
/ 19 марта 2010

Если это два разных (справочных) типа, то вы можете проверить их, используя 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;
     }
4 голосов
/ 19 марта 2010

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

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

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

3 голосов
/ 19 марта 2010

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

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

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

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

0 голосов
/ 07 июня 2019

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

(i.name != null ? set id to i.name : set id to i.inner.name)
0 голосов
/ 19 марта 2010

что-то вроде

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...