使用linq展平数据

时间:2011-09-20 02:21:22

标签: c# linq

public class A
{
    public string Value1 { get; set; }
    public int Value2 { get; set; }
    public List<B> Values { get; set; }
    public int Value3 { get; set; }          
}

public class B
{
    public int Id { get; set; }
    public string X { get; set; }
}

public class Result
{
    public string Value1 { get; set; }
    public int Value2 { get; set; }
    public string ValueB1X { get; set; }
    public string ValueB2X { get; set; }
    ...
    public string ValueBnX { get; set; }
    public int Value3 { get; set; }  
}

我需要将A列表转换为结果列表。任何想法如何用LINQ完成? 基本上我需要的是:

A[0] = |Value1|Value2|Value2|
        B[0]
        B[1]
        B[2]

A[1] = |Value1|Value2|Value2|
        B[0]
        B[1]
        B[2]

转换为

              +------------------------------------------------------+
     rowA[0]  | Value1 | Value2 |  B[0].X | B[1].X | B[1].X | Value3 |
     rowA[1]  | Value1 | Value2 |  B[0].X | B[1].X | B[1].X | Value3 |

1 个答案:

答案 0 :(得分:1)

您需要知道您将拥有多少B,因为需要编写Result类来容纳该数量的项目。所以这不是一个动态的解决方案,可以像你似乎暗示的任何数量的B一样工作(1..n)

更好的设计是

public class Result 
{
    public string Value1 { get; set; }     
    public int Value2 { get; set; }     
    public List<B> BValues { get; set; }
}

或者,假设B Id始终是唯一的,

public class Result 
{
    public string Value1 { get; set; }     
    public int Value2 { get; set; }     
    public Dictionary<int, string> BValues { get; set; }
}

然后构建一个字典 -

List<A> list = GetList();
List<Result> result = list.Select(a =>
    new Result()
    {
        Value1 = a.Value1,
        Value2 = a.Value2,
        BValues = a.Values.ToDictionary(b => b.Id, b => b.X)
    });