Lambda“if”声明?

我有两个对象,我想将它们转换为dictionarys。 我用toDictionary ()。

获取密钥的一个对象的lambda表达式是(i => i.name)。 对于另一个,它是(i => i.inner.name)。 在第二个中,i.name不存在。 如果i.name没有,i.inner.name总是存在。

是否有一个lambda表达式可以用来组合这两个? 基本上读作:

“如果i.name存在,则将id设置为i.name,否则将id设置为i.inner.name”。

非常感谢。

更新

当我说“不存在”时,我的意思是对象实际上没有属性,而不是属性只是null。

为什么不给每个对象一个自己的ToDictionary方法,因为在这种情况下它们显然有自己的行为。

如果无法添加到对象,因为您不拥有它们,您始终可以为它们编写扩展方法。

你试图强迫他们进入一个“共同”function的任何理由?

如果这些是两种不同的(引用)类型,那么您可以使用isas关键字来测试它们:

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

如果无法测试特定类型,则可以使用reflection来测试name属性本身:

 i => { var pi = i.GetType().GetProperty("name"); return (pi != null) ? pi.GetValue(i, null) : i.inner.name; } 

是的,条件运算符(“三元运算符”)可以执行您想要的操作:

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

当然,假设您可以通过检查null来检测名称的“存在”。

编辑 :在这种情况下,Kirschstein的回答当然更好。

一些东西

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

(也未经测试)