无法从 IEnumerable<Model> 更改 foreach 中的值
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
的 Return 仍然没有改变?如何在 foreach 中设置条件然后 return 结果
此处您尝试使用 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";
}
}
IEnumerable<T>
是查询,不是集合。虽然另一端有某种集合,但查询本身 不是集合 。您所定位的集合的性质将决定您是否可以修改内容。
一般的经验法则是,您不能期望 IEnumerable<T>
到 return 相同的对象列表两次,甚至不能期望您能够枚举超过一次 - IEnumerable<T>
仅枚举一次并拒绝第二次或第三次枚举是完全有效的(如果不寻常)。
在这种情况下,您拥有的实际上是一个类型为 IQueryable<Model>
的数据库查询,它被转换为 IEnumerable<Model>
。它仍然是一个 IQueryable<Model>
,这意味着每次你枚举它时,你都会(可能)获得相同的数据列表,但在全新的对象中。更改其中一个对象不会更改同一源记录的所有对象,也不会更改基础记录本身的内容。
如果您试图在不更改基础记录的情况下修改 returned 对象(似乎是这种情况),那么您需要将查询具体化到内存中的集合中。根据您希望对 returned 数据执行的操作,有几种方法可以做到这一点。
最简单的是使用.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;
}
现在记录在内存中的一个数组中,并且可以多次枚举该数组return使用完全相同的对象,而不是每次都从数据库中获取数据的新副本。
这个主题已经有了,但是有更有效的方法来做到这一点。
只需使用 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
在内存中加载项目
您可以使用 Linq 中的 .Select
。
return myEnumeration.Select(item => {
item.condition = "example";
return item;
})
如何从 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
的 Return 仍然没有改变?如何在 foreach 中设置条件然后 return 结果
此处您尝试使用 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";
}
}
IEnumerable<T>
是查询,不是集合。虽然另一端有某种集合,但查询本身 不是集合 。您所定位的集合的性质将决定您是否可以修改内容。
一般的经验法则是,您不能期望 IEnumerable<T>
到 return 相同的对象列表两次,甚至不能期望您能够枚举超过一次 - IEnumerable<T>
仅枚举一次并拒绝第二次或第三次枚举是完全有效的(如果不寻常)。
在这种情况下,您拥有的实际上是一个类型为 IQueryable<Model>
的数据库查询,它被转换为 IEnumerable<Model>
。它仍然是一个 IQueryable<Model>
,这意味着每次你枚举它时,你都会(可能)获得相同的数据列表,但在全新的对象中。更改其中一个对象不会更改同一源记录的所有对象,也不会更改基础记录本身的内容。
如果您试图在不更改基础记录的情况下修改 returned 对象(似乎是这种情况),那么您需要将查询具体化到内存中的集合中。根据您希望对 returned 数据执行的操作,有几种方法可以做到这一点。
最简单的是使用.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;
}
现在记录在内存中的一个数组中,并且可以多次枚举该数组return使用完全相同的对象,而不是每次都从数据库中获取数据的新副本。
这个主题已经有了,但是有更有效的方法来做到这一点。 只需使用 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
您可以使用 Linq 中的 .Select
。
return myEnumeration.Select(item => {
item.condition = "example";
return item;
})