Lambda“if”声明?

时间:2010-03-19 10:56:53

标签: c# lambda

我有两个对象,我想将它们转换为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。

5 个答案:

答案 0 :(得分:14)

如果这些是两种不同的(参考)类型,那么您可以使用isas关键字对其进行测试:

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)