gpt4 book ai didi

c# - 有什么方法可以使用 LINQ 查询来投影 "original plus a few changes"?

转载 作者:太空狗 更新时间:2023-10-29 22:58:49 24 4
gpt4 key购买 nike

我有构建对象集合的代码。我正在尝试减少 .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 设置为传入的值。

有没有一种优雅的方式来做到这一点?

附言我认为这无关紧要,但集合最终将作为 View 模型发送到 ASP.NET View 。显然,.ToList()可能必须在 View 获取它之前调用它,但我希望这是唯一的一次。

附言我应该说类型 X有大约30个属性!使用

select new {
x.Property1,
x.Property2,
Property3 = setMe,
Property4 = setme,
// ...
}

没有用,因为 ...将是另外 26 个属性。

最佳答案

取而代之的是:

var sortedList = sorted.ToList();
sortedList.ForEach(s=>
{
s.Property3 = setMe;
s.Property4 = setMe;
};

这样做:

sorted = sorted.Select(x =>
{
x.Property3 = setMe;
x.Property4 = setMe;
return x;
});

但是,如果您不想修改对象,则可以改为执行以下操作:

sorted = sorted.Select(x => new X()
{
Property3 = setMe,
Property4 = setMe,
// set all other properties to what they were before
// example: Property1 = x.Property1
});

我认为没有比这两种更好的方法了。

关于c# - 有什么方法可以使用 LINQ 查询来投影 "original plus a few changes"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24642338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com