C# LINQ、列表和添加项目问题
下面是一个数组C# LINQ、列表和添加项目问题,c#,linq,list,C#,Linq,List,下面是一个数组 package.Resources 如果我使用 package.Resources.ToList().Add(resouce); package.Resources实际上并不包含新项 我必须使用 var packageList = package.Resources.ToList(); packageList.Add(resource); package.Resources = packageList.ToArray(); 这是为什么?ToList()基于原始数组创建一个全
package.Resources
如果我使用
package.Resources.ToList().Add(resouce);
package.Resources实际上并不包含新项
我必须使用
var packageList = package.Resources.ToList();
packageList.Add(resource);
package.Resources = packageList.ToArray();
这是为什么?ToList()
基于原始数组创建一个全新的、不同的列表
LINQ是只读的;语言集成查询-只查询数据,不修改数据。所有LINQ方法都会产生一个投影-例如,它们将原始序列投影到一个新序列中,因此您总是在进行反投影。属性
资源
返回一个IEnumerable
Enumerable.ToList()
从此IEnumerable
构建一个新列表。然后,您将向新列表添加一个项目,而不是Resources
正在访问的原始集合,因此您的更新不会产生任何影响。当您调用package.Resources.ToList().Add(resource)代码>,其功能与执行此操作相同:
var resourcesAsList = new List<WhateverTypeResourcesContains>();
foreach(var item in package.Resources)
{
resourcesAsList.Add(item);
}
var resourcesAsList.Add(resouce);
var resourcesAsList=new List();
foreach(package.Resources中的var项)
{
资源列表。添加(项);
}
var resourcesalist.Add(resource);
这意味着package.Resources
尚未修改,您已经创建了一个列表,其中包含package.Resources包含的每个项目 当您在数组对象上调用.ToList()
时,您所说的是,“为我创建一个全新的列表
对象,它是与原始数组不同的引用,但使用原始数组中的对象作为列表中的对象。”
由于数组的大小是固定的,因此如果不将现有数组复制到容量增加的新数组中(甚至在VB世界中,ReDim Preserve
也会将数组复制到场景后面),就无法向其中添加(Add()
项)
因此,如果在实例化数组时不知道数组中的项目总数,那么应该问问自己为什么要使用数组。当您知道项目的数量或从现有的列表
或IEnumerable
实例化数组时,数组可以是一种保存对象集合的轻量级方式。但是,当您直到运行时才知道容量,并且源不是IEnumerable
,则列表可能是更好的选择,因为它是为了随着项目的添加而增加容量而构建的
我在类中使用以下集合类型作为属性:
IEnumerable
- 当我要对已经存在的集合进行迭代而不向其中添加时,我使用
IEnumerable
。例如,如果我查询目录中的文件,并希望将这些文件作为类中的属性,我可能会使用public IEnumerable DirectoryFiles{get;set;}
IEnumerable
允许我查询现有的一组数据,但我不一定关心它是什么集合,只要它实现了IEnumerable
列表
- 当我需要一个可以动态增长或收缩的集合时,我使用
列表
,即该集合不存在于其他地方,我可能需要从中添加或删除项目
- 一个很好的例子是,如果您允许用户在应用程序的用户界面中向列表框添加和删除项目。由于列表框中的项目可能会增加或减少,因此
列表
是有意义的
observedcollection
- 我在Silverlight/WPF世界中使用这种类型的集合,因为当集合中的项目数发生变化时,它具有内置事件。当您希望UI元素在列表更改时自动更新时,这对于数据绑定场景尤其方便
我几乎从不显式使用数组,除非我正在使用一个已经有数组的对象。诚然,它们是一种很好的存储集合的轻量级方式,但我通常可以使用上面列出的3种类型。将新项目“添加”到阵列时,您的预期结果是什么?在某个(哪个?)索引处具有新项的数组,替换以前可能存在的任何项?新的、更大的阵列?(从上一个代码看,它看起来像最后一个)它实际上是类中的一个列表,但该对象是从webmethod返回的,webmethod将其作为数组返回。我将向对象添加一个项,然后将其传递给另一个webmethod来保存它。是的,理想情况下这不会通过Web服务,但是,我别无选择。@Chad我知道这是怎么回事。我通常会出于很多相同的原因使用列表,也就是说,当我被迫使用列表时。