Лямбда "если" выражение?
У меня есть 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)