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我知道这是怎么回事。我通常会出于很多相同的原因使用列表,也就是说,当我被迫使用列表时。