选择和操作自定义类列表中的所有元素

时间:2013-12-02 09:51:37

标签: c# .net linq list lambda

我有一个自定义类列表。自定义类包含许多字段。我想返回整个列表,但操作一些字段并返回所有其他字段不变。让我们说我的班级有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();

谢谢!

1 个答案:

答案 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,
});