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的任何理由?
如果这些是两种不同的(引用)类型,那么您可以使用is
或as
关键字来测试它们:
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);
(也未经测试)