Lambda “if” statement?

2019-03-13 16:58发布

I have 2 objects, both of which I want to convert to dictionarys. I use toDictionary<>().

The lambda expression for one object to get the key is (i => i.name). For the other, it's (i => i.inner.name). In the second one, i.name doesn't exist. i.inner.name ALWAYS exists if i.name doesn't.

Is there a lambda expression I can use to combine these two? Basically to read as:

"if i.name exists then set id to i.name, else set id to i.inner.name".

Many thanks.

Update

When I say "don't exist", I mean the objects don't actually have the properties, not that the properties are just null.

标签: c# lambda
4条回答
Melony?
2楼-- · 2019-03-13 17:09

Yes, the conditional operator ("ternary operator") does what you want:

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

Assuming, of course, that you can detect the "existence" of the name by checking for null.

Edit: In that case, Kirschstein's answer is better, of course.

查看更多
来,给爷笑一个
3楼-- · 2019-03-13 17:10

If these are two distinct (reference) types then you can test them using the is or as keywords:

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

If you can't test for specific types then you can use reflection to test for the name property itself:

i => {
         var pi = i.GetType().GetProperty("name");
         return (pi != null) ? pi.GetValue(i, null) : i.inner.name;
     }
查看更多
smile是对你的礼貌
4楼-- · 2019-03-13 17:20

something along the lines of

collection1.ForEach(i => myDictionary.Add((i.name.length == 0 ? i.inner.name : i.name),value);

(untested) should do the trick if i.name is not null (an empty string), or

collection1.ForEach(i => myDictionary.Add((i.name ?? i.inner.name),value);

(also untested)

查看更多
仙女界的扛把子
5楼-- · 2019-03-13 17:21

Why don't you give each object a ToDictionary method of their own, as they obviously have their own behaviours in this case.

If you can't add to the objects, because you don't own them, you can always write extension methods for them.

Any reason your trying to force feed them into one "common" function?

查看更多
登录 后发表回答