匿名对象内的条件运算符

时间:2013-06-28 10:50:01

标签: c# asp.net

var x = new {
    Name = "qwe",
    Options = someList.Select(x=>x.KEY).Select(x => 
        new {

            Title: someOtherList.FirstOrDefault(y => y.KEY == x) != null ? 
                   someOtherList.FirstOrDefault(y => y.KEY == x).Title : 
                   null
        }
    )
}).ToList();

我正在制作一个可序列化的对象列表。请查看我如何为每个选项获取Title属性。

我的问题是我正在获取比标题更多的属性,并且条件运算符对每个属性都感觉相当过分。

有没有“更好”的写作方式?

3 个答案:

答案 0 :(得分:4)

一个简单的解决方案是使用以下内容:

Title= someOtherList.Where(y => y.KEY == x).Select(x => x.Title).FirstOrDefault()

这是在做以下事情:

  1. 从someOtherList中,返回Key等于x的元素。
  2. 从这些元素中,选择Title
  3. 返回第一个标题 - 如果没有,则返回null

答案 1 :(得分:1)

通常,与原始代码最相似的方法是使用statement lambda

Options = someList.Select(x=>x.KEY).Select(x => 
    {
        var other = someOtherList.FirstOrDefault(y => y.KEY == x);
        return new {
           Title = other == null ? null : other.Title
        };
    })

答案 2 :(得分:0)

您可以改为调用方法:

Options = someList.Select(x=>x.KEY).Select(x => CreateObject(x, someOtherList));

public YourObject(or dynamic) CreateObject(YourObject x, List<SomeOtherObject> someOtherList)
{
    var other = someOtherList.FirstOrDefault(y => y.KEY == x);

    return new
    {
        Title = (other == null ? null : other.Title),
        Foo = (other == null ? null : other.Foo),
        ...
    }
}

或者使用Linq query expression中的let关键字与@DarinDimitrov显示相同的内容。