Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq更新列表的对象_C#_Linq - Fatal编程技术网

C# 使用Linq更新列表的对象

C# 使用Linq更新列表的对象,c#,linq,C#,Linq,我想使用Linq在列表中分配一个对象,但我找不到如何分配。 我试过这个: Items.i=>i.Code==line.Code.Single=line 但我似乎无法给这个陈述一个对象。 我可以修改这些对象的属性,如下所示: Items.Where(i => i.Code == line.Code).Single().name = line.name; 但给它完整的项目似乎不被接受。 是否有理由阻止将我的值分配给兼容项? 谢谢您的回答。不能使用LINQ替换列表中的值,因为LINQ是集合的投

我想使用Linq在列表中分配一个对象,但我找不到如何分配。 我试过这个:

Items.i=>i.Code==line.Code.Single=line

但我似乎无法给这个陈述一个对象。 我可以修改这些对象的属性,如下所示:

Items.Where(i => i.Code == line.Code).Single().name = line.name;
但给它完整的项目似乎不被接受。 是否有理由阻止将我的值分配给兼容项?
谢谢您的回答。

不能使用LINQ替换列表中的值,因为LINQ是集合的投影

您可以获取项目,然后使用IndexOf在列表中找到它:

然而,就算法复杂性而言,这种方法远远不是最优的,因为它必须多次阅读列表。 您可以尝试阅读更多关于查找、添加或替换项的内容,在您的情况下,通过键高效地编写代码

考虑一下单一方法返回的结果。它返回对对象的引用,该引用与您在Where方法中传递的谓词相同。具体地说,当在Where方法中传递谓词的项中只有一个项时,您将获得对该对象的引用。如果有多个项,您将得到一个异常,如果没有项,您将得到null。让我们考虑一个快乐的案例,在这个案例中,您将只有一个项目。在这种情况下,基本上您尝试为该引用指定一个新对象。这没有任何意义。另一方面,您可以在事后尝试,保持引用可以改变其状态

来自MSDN文档:

通过使用查询语法,您可以执行筛选、排序和查询 使用最少的代码对数据源上的操作进行分组

不能使用LINQ执行赋值,需要使用索引更新列表中的特定记录

要更新记录,您可以尝试

Single是一个返回值的方法。通常不能从表达式中为返回赋值。说到底,这与说:

Math.Max32,42=14; 在这一点上,马克斯会说,嗯,不;我是在告诉你答案——我没想到你会告诉我


理论上,您在这里想要的是可能的,但只有在涉及ref返回的高级场景中。LINQ不处理ref返回。

下面的LINQ会满足您的要求吗

      items.Where(i => i.Code== line.code)?.ToList()?.ForEach(i => i.name= line.name);

不,单个对象中有很多属性需要更改,我认为直接提供新对象比多次执行Linq查询要好,谢谢您的回答though@RyanL然后我们可以使用,items.Wherei=>i.Code==line.Code?.ToList?.ForEachi=>i=line,对吗?
int index = Items.FindIndex(x => x.Code == line.Code); //returns -1 if record not found
Items[index]?.Name = "Stackoverflow";
      items.Where(i => i.Code== line.code)?.ToList()?.ForEach(i => i.name= line.name);