c#遍历linq结果和更新字段

时间:2018-10-10 18:03:02

标签: c# linq

我在linq中有以下内容:

var rss = result.Select(x => new { x.SampleDate, x.DataValue })
                .OrderBy(a => a.SampleDate).ToList();

请注意,SampleDate是可为空的字段。

我需要更广泛的内容,但是我想浏览rss并使用foreach将毫秒添加到SampleDate中。

我尝试过:

 foreach (var r in rss)
 {
     r.SampleDate = r.SampleDate.Value.AddMilliseconds(1);              
 }

但收到消息:

  

SamplePoint无法分配,它是只读的。

上面有一个{ get; set; }。我的分配方式有问题吗?

2 个答案:

答案 0 :(得分:2)

您收到错误消息是因为rss是匿名类型的列表,而不是result集合中项目的类型。这些匿名类型是不可变的,这就是为什么您不能分配值的原因。

相反,请尝试以下操作:

var rss = result.Select(x => new { SampleDate = x.SampleDate?.AddMilliseconds(1), x.DataValue })
                .OrderBy(a => a.SampleDate).ToList();

注意使用Null条件运算符introduced in C# 6.0

答案 1 :(得分:0)

您将需要一个具体的类型来完成此操作,因为匿名类型(new { ... })一旦创建就无法修改。

public class RssData
{
    public DateTime? SampleDate {get; set;}
    public string DataValue {get; set;} // use string only if appropriate - I guessed at its type
}

然后,无论采用哪种方法,您都在做什么...

public void YourMethod()
{
    var rss = result.Select(x => new RssData { x.SampleDate, x.DataValue })
              .OrderBy(a => a.SampleDate).ToList(); // .ToList() may be redundant here as the foreach below will force the iteration, but that's not really the point of this. :)

    foreach(var r in rss)
    {
        if(r.SampleDate.HasValue)
            r.SampleDate = r.SampleDate.Value.AddMilliseconds(1);
    }
}

希望这对您有帮助...