我有一个自定义类列表。自定义类包含许多字段。我想返回整个列表,但操作一些字段并返回所有其他字段不变。让我们说我的班级有10个领域:
这是我的尝试:
List<custom> data = somedatalist;
data.Select(a=> a.field1 = a.field1 * 6).Select(a => a.field10 = field10*7).tolist()
这不起作用,因为我不选择第一个选择中的所有元素。
我能做到:
Select( a = > new Custom{....}).ToList();
但是后来我需要重写所有字段,如果我想将大部分字段保留为原样并且仅操作10个中的2个就显得很麻烦。
下一次尝试:
List<custom> data = somedatalist;
data.ForEach(a=> a.field1 = a.field1 * 6 && a => a.field10 = field10*7).tolist()
也不起作用,不知道为什么。如果我更换“&amp;&amp;”通过“,”它不起作用。
我会感谢其他建议:
Select( a = > new Custom{....}).ToList();
谢谢!
答案 0 :(得分:2)
这应该有效:
data.ForEach(a => {
a.field1 = a.field1 * 6;
a.field10 = a.field10 * 7;
});
或等效地:
data.ForEach(a => {
a.field1 *= 6;
a.field10 *= 7;
});
请注意,ForEach
方法不是Linq的一部分。它是List<T>
类的成员。也没有必要在最后调用ToList
- 事实上你不能,因为ForEach
的返回类型是void
。
这将修改原始列表中的所有项目。如果您想创建一个已修改对象的列表,保留原始未修改的对象,那么使用标准Linq方法创建一个新对象是可行的方法:
var newList = data.Select(a => new Custom {
field1 = a.field1 * 6,
field2 = a.field2,
...
field9 = a.field9,
field10 = a.field10 * 7,
});
如果您需要编写许多此类查询,并且每次都不想键入所有字段名称,则可以创建一种复制构造函数:
public class Custom {
public Custom(Custom other)
{
this.field1 = other.field1;
this.field2 = other.field2;
...
}
}
然后你可以像这样使用它:
var newList = data.Select(a => new Custom(a) {
field1 = a.field1 * 6,
field10 = a.field10 * 7,
});