如何使用lambda表达式选择项目

时间:2017-09-29 09:12:46

标签: c# lambda

我从数据存储enter image description here

中选择数据

我可以使用以下查询

获取第一个数组[0] {IHSWCFService.ServiceReference1.Observation}
var newData = data.Select(a => new IHSData
{
    PriceSymbol = Convert.ToString(a.PriceId),
    PeriodData = Convert.ToDateTime(a.ObservationVector.Select(x => x.Period).FirstOrDefault()),
    StatusID = Convert.ToInt32(a.ObservationVector.Select(x => x.StatusId).ToList()),
    Price = Convert.ToDouble(a.ObservationVector.Select(x => x.price).FirstOrDefault()),
});

但我也想选择下一个数组。如下面的屏幕截图所示 enter image description here

[0]{IHSWCFService.ServiceReference1.Observation} 
[1]{IHSWCFService.ServiceReference1.Observation}
[2]{IHSWCFService.ServiceReference1.Observation}
你能帮我吗?谢谢

1 个答案:

答案 0 :(得分:1)

您可能希望IHSData中的所有属性都是列表:

var newData = data.Select(a => new IHSData
{
    PriceSymbol = Convert.ToString(a.PriceId),
    PeriodData = a.ObservationVector.Select(x => Convert.ToDateTime(x.Period)).ToList(),
    StatusID = a.ObservationVector.Select(x => Convert.ToInt32(x.StatusId)).ToList(),
    Price = a.ObservationVector.Select(x => Convert.ToDouble(x.price)).ToList(),
});

这不是一个好主意,因为你必须单独索引它们。所以另一种选择是使用SelectMany

var newData = data
    .SelectMany(a => a.ObservationVector.Select(v =>
        new IHSData
        {
            PriceSymbol = Convert.ToString(a.PriceId),  // parent PriceId
            PeriodData = Convert.ToDateTime(v.Period),
            StatusID = Convert.ToInt32(v.StatusId),
            Price = Convert.ToDouble(v.price),
        }))
   .ToList();

后一种方法将为每个IHSData创建一个单独的ObservationVector实例,其中一些将共享父类的PriceId

或者,第三种方法是创建一个新类,它将是ObservationVector"的解析版本,即包含已解析值的属性,如:

var newData = data.Select(a => new IHSData
{
    PriceSymbol = Convert.ToString(a.PriceId),
    Data = a.ObservationVector.Select(x => ConvertObservationVector(x)).ToList()
});

其中ConvertObservationVector是一种从ObservationVector转换为已解析类的方法。