如何让Lambda真实

时间:2014-02-23 18:34:42

标签: c# serialization anonymous-function lambda

所以我使用命令将变量保存到序列化文件中。我保存了以下数据:

data.Save("ships", this.ships.Select(x => x.Name));

这应该输出一个IEnumerable,但它似乎输出了一些不同的东西,我猜这是与Lambda的懒惰初始化?错误是:

Type 'System.Linq.Enumerable+WhereSelectListIterator`2[[~~~],[~~~]]' in Assembly '~~~' is not marked as serializable.

错误是由this.shipsnon-serializable类型的事实引起的,与类型字符串的.Name的返回相比较。

所以我希望我能找到如何让它恢复真正的价值?

我已经意识到添加.ToList()会有效,但我对整洁的解决方案感到好奇。

1 个答案:

答案 0 :(得分:2)

System.Linq.Enumerable.WhereSelectListIterator<TSource, TResult>确实实现了IEnumerable<TResult>,正如您所知,它不是可序列化的。

WhereSelectListIterator存储源和查询定义,并允许您的查询是惰性的,这意味着它在您需要结果时进行评估,而不是在创建查询时进行评估。

如果要序列化查询结果,则必须强制进行评估。 ToList()ToArray都可以正常使用。

data.Save("ships", this.ships.Select(x => x.Name).ToList());

为了确保以后不会发生此类错误,您可以考虑将Save方法定义更改为使用ICollection<T>而不是IEnumerable<T>