【发布时间】:2014-07-08 22:13:22
【问题描述】:
我有构建对象集合的代码。我正在尝试减少我拨打的.ToList() 的数量,因此我尝试尽可能长时间地保持IEnumerable<T>。
我已经差不多完成了,除了两个属性需要设置为传递给调用方法的值:
private IEnumerable<X> BuildCollection(int setMe){
IEnumerable<Y> fromService = CallService();
IEnumerable<X> mapped = Map(fromService);
IEnumerable<X> filteredBySomething = FilterBySomething(mapped);
IEnumerable<X> sorted = filteredBySomething
.OrderBy(x=>x.Property1)
.ThenBy(x=>x.Property2);
// Here's the problem: return "sorted", but with each "Property3"
// and "Property4" set to "setMe". I don't want to do:
var sortedList = sorted.ToList();
sortedList.ForEach(s=>
{
s.Property3 = setMe;
s.Property4 = setMe;
};
return sortedList;
}
如果可以在select 中使用某种通配符,那么我可以执行以下操作:
return from f in filteredBySomething
order by f.Property1, f.Property2
select new {
f.*,
f.Property3 = setMe,
f.Property4 = setMe
};
也就是说,我想将已排序的对象流回,但将 Property3 和 Property4 设置为传入的值。
有没有优雅的方法来做到这一点?
附:我认为这并不重要,但该集合最终将作为视图模型发送到 ASP.NET 视图。显然,.ToList() 可能必须在 View 获取它之前被调用,但我希望这是唯一一次。
附言我应该说X 类型有大约30 个属性!使用
select new {
x.Property1,
x.Property2,
Property3 = setMe,
Property4 = setme,
// ...
}
不会有用,因为 ... 将是另外 26 个属性。
【问题讨论】:
标签: c# linq projection