【问题标题】:Selecting and manipulating all elements in list of custom class选择和操作自定义类列表中的所有元素
【发布时间】:2013-12-02 09:51:37
【问题描述】:

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

也不行,不知道为什么。此外,如果我将“&&”替换为“,”,它也不起作用。

我将不胜感激其他建议:

Select( a = > new Custom{....}).ToList();

谢谢!

【问题讨论】:

  • manipulate some of the fields 然后不要使用LINQ,而是使用循环。
  • 很好,我想我可以在扩展方法中轻松做到这一点,但我处于 linq 模式...:)
  • 好吧,据我了解,第一个选择过滤器仅适用于 field1,所以如果我执行第二个选择,则数据不再包含其余字段
  • LINQ 在您尝试更新原始列表时是一种查询语言。如果要将原件投影到另一种形式,则必须创建一个新对象。要么这样,要么修改原来的

标签: c# .net linq list lambda


【解决方案1】:

这应该可行:

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&lt;T&gt; 类的成员。最后也不需要调用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,
});

【讨论】:

  • 谢谢!这也返回 field2-field9 不变?如果您使用匿名类型,数据仍然是 List 类型吗?
  • @nik 这里没有匿名类型。 a =&gt; { ... } 是一个多语句 lambda 表达式。
  • @nik:但请注意,您不应该使用ToList 来创建List&lt;T&gt;,只是为了能够使用List.ForEachToList 创建一个冗余的新集合。
猜你喜欢
  • 1970-01-01
  • 2015-04-09
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 2020-09-13
相关资源
最近更新 更多