gpt4 book ai didi

c# - 如何在遍历 IEnumerable 时更改值

转载 作者:太空宇宙 更新时间:2023-11-03 21:26:54 27 4
gpt4 key购买 nike

我一直卡在这个问题上,并进行了大量搜索/阅读以试图理解这个问题,但我就是不明白。我想知道是否有人可以向我提供一个示例,说明如何在循环 IEnumerable<> 时更新对象值。

例子:

public class MyClass
{
private IEnumerable<MyData> _MyData = null;

public MyClass() {}
public MyClass(string parm1, int parm2) { Load(parm1, parm2); }

public IEnumerable<MyData> Load(string parm1, int parm2)
{
_MyData = _dbContext.MyData.Where(m => m.Parm1 == parm1 && m.Parm2 == parm2);

foreach(MyData mydata in _MyData)
{
if(mydata.Parm2 == 1)
{
mydata.Parm1 = "Some value";
}
}
return _MyData;
}
}

上面的代码不起作用,因为在循环中对 mydata.Parm1 所做的任何更改都不会保留。我读了一篇 SO 文章,建议进行如下更改:

for (int i = 0; i < _MyData.Count(); i++)
{
_MyData.Skip(i).FirstOrDefault().Parm1 = "Some Value";
}

这行得通,但它真的很难看,我很难相信没有更干净的方法。对于单个更改,它可能是可以接受的,但我需要进行多项更改。所以我试过这个:

for (int i = 0; i < _MyData.Count(); i++)
{
MyData md = _MyData.ElementAt(i);
md.Parm1 = "Some Value";
}

但是我不明白如何将修改后的md放回_MyData中保存修改。

我认为我经历所有这些麻烦的主要原因是我不了解如何更改元素并保留它们。除非我经历这些麻烦,否则我所做的任何更改似乎都会恢复到原来的值。也许有人可以指出我哪里出错了。我想像这样使用这个类:

IEnumerable<MyData> MyDataResult = new MyClass("Parm1", 4);

使用上面的代码行,我可以跟踪 Load() 函数并看到正在进行所需的更改,但是完成后 MyDataResult 包含原始的值而不是我看到的值发生了变化。

很明显我的代码是错误的,但我希望我已经足够清楚地说明我想做什么以及我遇到困难的地方。

最佳答案

试试这个-

_MyData = _dbContext.MyData.Where(m => m.Parm1 == parm1 && m.Parm2 == parm2).ToList();

明确地说,您当前代码中的本质上是一个查询,您在 Load 方法中枚举它,试图更新它的一些属性,但最后,您最终返回了 查询,而不是查询中的更新值。

Load的来电者方法,最终将再次运行查询,只能看到来自数据库的直接值。

添加.ToListLoad 中查询的末尾方法,具体化查询,然后您在内存中执行其余操作。

编辑:以防万一,如果此查询可能返回的大量数据存在性能问题,那么您也可以考虑这种替代方法 -

public IEnumerable<MyData> Load(string parm1, int parm2)
{
_MyData = _dbContext.MyData.Where(m => m.Parm1 == parm1 && m.Parm2 == parm2);

foreach(MyData mydata in _MyData)
{
if(mydata.Parm2 == 1)
{
mydata.Parm1 = "Some value";
}

yield return myData;
}
}

作为 Load 的调用者,这将使查询保持惰性,并且仍然返回修改后的值遍历 IEnumerable<MyData>Load 返回.

关于c# - 如何在遍历 IEnumerable 时更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26454861/

27 4 0