使用select将foreach转换为linq表达式

时间:2015-04-03 11:48:32

标签: c# linq

我有表达:

  var newValues = MetarDecoder.Decode(telegram)
                .OfType<MeteoParameter<decimal>>()
                .Select(parameter => MeteoParameterFactory
                .Create(parameter.ParameterId, parameter.DateTime.ToLocalTime(), parameter.Status, parameter.Value))                            
                .ToList();

MeteoParameterFactory由于某些原因无法更改,只需按原样使用。

MeteoParameter也有string Info属性。

我需要将Info从旧parameter复制到MeteoParameterFactory.Create()结果。

没有LINQ,它看起来像:

 var val = MetarDecoder.Decode(telegram).OfType<MeteoParameter<decimal>>().ToList();

                        foreach (var param in val)
                        {
                            var parameter = MeteoParameterFactory.Create(param.ParameterId, param.DateTime.ToLocalTime(), param.Status, param.Value);
                            parameter.Info = param.Info;
                            newValues.Add(parameter);
                        }

那么,有没有办法在下面显示的LINQ表达式中添加这个部分?

2 个答案:

答案 0 :(得分:3)

Select中,您可以创建一个匿名函数,它返回在其中创建的parameter

var newValues = MetarDecoder.Decode(telegram)
            .OfType<MeteoParameter<decimal>>()
            .Select(param => { 
                   var parameter = MeteoParameterFactory.Create(param.ParameterId, param.DateTime.ToLocalTime(), param.Status, param.Value);
                   parameter.Info = param.Info;
                   return parameter;
             }).ToList();

答案 1 :(得分:1)

var val = MetarDecoder
            .Decode(telegram)
            .OfType<MeteoParameter<decimal>>()
            .ToList()
            .ForEach(param => 
            {
                var parameter = MeteoParameterFactory.Create(param.ParameterId, param.DateTime.ToLocalTime(), param.Status, param.Value);
                parameter.Info = param.Info;
                newValues.Add(parameter);
            });