- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直卡在这个问题上,并进行了大量搜索/阅读以试图理解这个问题,但我就是不明白。我想知道是否有人可以向我提供一个示例,说明如何在循环 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
的来电者方法,最终将再次运行查询,只能看到来自数据库的直接值。
添加.ToList
到 Load
中查询的末尾方法,具体化查询,然后您在内存中执行其余操作。
编辑:以防万一,如果此查询可能返回的大量数据存在性能问题,那么您也可以考虑这种替代方法 -
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/
任何人都可以向我解释 IEnumerable 和 IEnumerator 之间的区别是什么, 以及如何使用它们? 谢谢!!! 最佳答案 通常,一个 IEnumerable是可以枚举的对象,例如列表或数
function TSomething.Concat(const E: IEnumerable>): IEnumerable; begin Result := TConcatIterator.Cr
我正试图找到解决这个问题的办法: 给定一个 IEnumerable> 我需要一个返回输入的方法/算法,但是如果多个 IEnumerable 具有相同的元素,则每个巧合/组只返回一个。 例如 I
我有一个有趣的问题:给定一个 IEnumerable , 是否有可能产生 IEnumerable> 的序列一次将相同的相邻字符串分组? 让我解释一下。 1。基本说明示例: 考虑以下 IEnumerab
我有课 public class Test { public void M1(IEnumerable> p) { } public void M2(IEnumerable)> p) {
我尝试解决下一个练习: 输入:整数列表 count >= 1;一些正整数 k 输出:此整数的所有可能元组,长度为 k ; 例如 输入: {1, 2}; k = 4 输出: { {1, 1, 1, 1
抱歉奇怪的标题。我想要实现的目标很简单: IEnumerable> listoflist; IEnumerable combined = listoflist.CombineStuff(); 例子:
公共(public)类项目 { ... public class Order { public List Items ... } public class Customer {
我有一个 IEnumerable>我想转换为单一维度集合的集合。是否可以使用通用扩展方法来实现这一点?现在我正在这样做以实现它。 List filteredCombinations = new Lis
我有一个 IEnumerable> CustomObject在哪里有一个 x (用作键(在本例中为 1 、 2 、 3 ))和 y值(value)。一些假数据: { { {1, 2}, {2, 4
我需要做的是选择嵌套元素列表,这是我的查询 returns IEnumerable>这是我的 linq 表达式: from a in (questions.Select(x => x.AnswerLi
如何使用 LINQ(或其他方式)将 IEnumerables 的 IEnumerable 拆分为一个平面 IEnumerable? 最佳答案 enumerable.SelectMany(x => x)
例如: public interface IEnumerable { IEnumerator GetEnumerator(); } //This interface allows the c
我对 Reflection.Emit 有疑问。我想要动态创建的类,它具有 ICollection 的简单实现。我定义的所有方法都很好,而不是接下来的两个: public IEnumerator Get
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why was IEnumerable made covariant in C# 4? 我正在查看 MSDN
IEnumerator.MoveNext() 的实现是否预计会相对较快?或者如果“移动到下一项” 包括磁盘 IO、Web 请求或其他可能长时间运行的操作是否可以? 例如,我正在处理一个处理文档的项目,
以下代码创建了 List 的中间实例并在 yield 返回之前将值附加到它。有没有一种好的方法可以避免创建实例并直接 yield 返回单元格值? IEnumerable> GetStrValues()
我有两个 IEnumerable 对象,我想验证其中一个是否包含另一个的所有元素。 我正在使用 obj1.Intersect(obj2).Any() 但交集没有像我预期的那样工作。即使 obj2 中只
我正在尝试这个 MSDN page 上的例子.我试图更改 GetEnumerator 方法。我知道那似乎有些不对劲,但它符合要求然后就不会运行。错误是枚举器尚未启动,应该调用 MoveNext,但 它
我写过关于自定义 IEnumerator 的文章。从中生成 IEnumerable 的最简单方法是什么?理想的解决方案(一行代码)是是否有一些用于该目的的类。还是我必须自己创建? 最佳答案 不幸的是,
我是一名优秀的程序员,十分优秀!