我在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; }
。我的分配方式有问题吗?
答案 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);
}
}
希望这对您有帮助...