使用LINQ将对象属性组合到列表中

时间:2010-10-11 21:52:59

标签: c# linq

说我在objectX上有属性num1,num2,num3。我想获取一个objectX列表并创建一个用num1,num2,num3值填充的整数列表。

以下是使用System.Drawing.Point的示例:

Point p1 = new Point(1,2);
Point p2 = new Point(3,4);

var points = new[] { p1, p2 };
var combined = points.SelectMany(a => new[] {a.X, a.Y});

这是最可读的方式吗?语法对我来说有点烦躁。你能用LINQ Query expression吗?

FYI 在此示例中使用LBushkin的查​​询表达式如下所示:

var combined = from p in points
    let values = new[] {p.X, p.Y}
    from x in values
    select x;       

我会留下一个练习让读者决定哪个更具可读性。

2 个答案:

答案 0 :(得分:7)

我认为最干净的是如果ObjectX有一个属性来组合你的num属性,让我们称之为Numbers:

public IEnumerable<int> Numbers 
{
    get
    {
        yield return Num1;
        yield return Num2;
        yield return Num3;
    }
}

现在,只要你有一个对象的acecss,就可以轻松查询它的数字属性,让你做:

var combined = objectXs.SelectMany(a => a.Numbers);

答案 1 :(得分:3)

这是一个我可能会使用LINQ查询语法的例子:

var result = from item in someList
             let values = new int[]{ item.A, item.B, item.C, ... }
             from x in values
             select x;

使用自定义迭代器(如Kirk所示)可能更有效,因为它不需要分配临时数组 - 但CLR相对擅长回收短期对象,因此在实践中这很少是一个问题。