繁体   English   中英

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

[英]Can't change value in foreach from IEnumerable<Model>

如何从IEnumerable<Model>更改foreach对象的值。

代码:

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; }
}

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

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

一般的经验法则是,您不能期望IEnumerable<T>两次返回相同的对象列表,甚至不能期望您能够多次枚举它 - 它是完全有效的(如果不寻常)对于IEnumerable<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;
}

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

在这里,您尝试使用LINQ创建一个Model列表,然后您正在迭代相同的内容以向每个项目添加一个附加属性。 那么为什么不在创建列表时添加属性而不是附加循环呢? 通过尝试这样的事情使事情变得简单:

from x in db.PJSPEvaluation
select new Model
{
   foo = x.Foo,
   bar = x.Bar,
   condition = GetCondition(x.Foo)              
};

其中GetCondition()可以定义为:

private string GetCondition(int foo)
{
   if(item.foo == 1) 
   { 
      return "a";
   }
   else if(item.foo == 2) 
   { 
      return "b";
   }
   else
   {
      return "xx";    
   }
}

这个主题已经有,但有更有效的方法来做到这一点。 只需使用 List<> 而不是 Array[]。

  public List<Model> ListDaftarPjsp()
    {
        List<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; }
    }

如果您不想使用.ToArray.ToList在内存中加载项目

您可以使用.Select from Linq。

return myEnumeration.Select(item => {
   item.condition = "example";
   return item;
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM