如何从foreach
更改IEnumerable<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; }
}
我已经创建了Model
。然后,我使用foreach循环结果,然后进行设置。但是condition
的收益仍然没有变化?如何在foreach中设置条件,然后返回结果
答案 0 :(得分:2)
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;
}
现在,记录位于内存中的数组中,并且可以多次枚举该数组,以返回相同的精确对象,而不是每次都从数据库中获取数据的新副本。
答案 1 :(得分:1)
在这里,您尝试使用Model
创建LINQ
的列表,然后您要对其进行迭代,以向每个项目添加其他属性。那么,为什么不在创建列表时添加属性,而是进行附加循环?通过尝试类似的事情使事情变得简单:
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";
}
}
答案 2 :(得分:0)
已经有此主题,但是有更有效的方法来实现。 只需使用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; }
}