无法从 IEnumerable<Model> 更改 foreach 中的值

Stf*_*vns -1 c# linq ienumerable model

如何foreachIEnumerable<Model>.

代码:

public IEnumerable<Model> ListDaftarPjsp()
{
    IEnumerable<Model> list = from x in db.PJSPEvaluation
                              select new Model
                              {
                                  foo = x.Foo,
                                  bar = x.Bar               
                              };
    foreach (Model item in list) {
        item.condition = "example";
    }
    return list;
}

public class Model{
    public string foo{ get; set; }
    public string bar { get; set; }
    public string condition{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我已经创建了Model. 然后我使用foreach循环结果,然后设置它。但是 Return forcondition仍然没有改变?如何在foreach中设置条件然后返回结果

Cor*_*rey 7

IEnumerable<T>是一个查询,而不是一个集合。虽然另一端有某种集合,但查询本身不是集合。您所针对的集合的性质将决定您是否可以修改内容。

一般的经验法则是,您不能期望 anIEnumerable<T>两次返回相同的对象列表,甚至不能期望您能够对其进行多次枚举 - 对 anIEnumerable<T>进行枚举是完全有效的(如果不寻常)一次,拒绝列举第二次或第三次。

在这种情况下,您所拥有的实际上是一个类型IQueryable<Model>为强制转换为 的数据库查询IEnumerable<Model>。它仍然是一个IQueryable<Model>,这意味着每次您枚举它时,您都会(可能)获得相同的数据列表,但在全新的对象中。更改其中一个对象不会更改同一源记录的所有对象,也不会更改基础记录本身的内容。

如果您尝试在不更改基础记录的情况下修改返回的对象(似乎是这种情况),那么您需要将查询具体化为内存中的集合。有几种方法可以做到这一点,具体取决于您希望对返回的数据做什么。

最简单的是使用.ToArray()扩展方法将查询转换为数组:

public Model[] ListDaftarPjsp()
{
    var query = from x in db.PJSPEvaluation
                select new Model
                {
                    foo = x.Foo,
                    bar = x.Bar               
                };

    var list = query.ToArray();

    foreach (Model item in list) 
    {
        item.condition = "example";
    }

    return list;
}
Run Code Online (Sandbox Code Playgroud)

现在记录在内存中的一个数组中,并且可以多次枚举该数组,返回相同的确切对象,而不是每次都从数据库中获取数据的新副本。

  • @BorisD 是的。已实现的引用类型集合(数组、列表等)通常会向您提供对所包含对象的引用。如果这些对象是可变的,您可以更新它们。从流、数据库、网络连接或其他源动态构造对象的枚举可能会为您提供新构造的对象,然后将其丢弃,因此不会保留更改。 (2认同)