我有两个对象,我想将它们转换为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。
答案 0 :(得分:14)
如果这些是两种不同的(参考)类型,那么您可以使用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;
}
答案 1 :(得分:4)
为什么不给每个对象一个自己的ToDictionary
方法,因为在这种情况下他们显然有自己的行为。
如果您无法添加对象,因为您不拥有它们,您始终可以为它们编写扩展方法。
你试图强迫他们进入一个“普通”功能的任何理由?
答案 2 :(得分:3)
是的,条件运算符(“三元运算符”)可以执行您想要的操作:
(i => i.name != null ? i.name : i.inner.name)
当然,假设您可以通过检查null
来检测名称的“存在”。
编辑:在这种情况下,Kirschstein的回答当然更好。
答案 3 :(得分:0)
的内容
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);
(也未经测试)
答案 4 :(得分:0)
作为内联的查询,我将使用三元运算符,因此:
(i.name != null ? set id to i.name : set id to i.inner.name)