代码之家  ›  专栏  ›  技术社区  ›  CaffGeek

LINQ、列表和添加项目问题

  •  0
  • CaffGeek  · 技术社区  · 14 年前

    下面是一个数组

    package.Resources
    

    如果我使用

    package.Resources.ToList().Add(resouce);
    

    package.resources实际上不包含新项目。

    我必须使用

    var packageList = package.Resources.ToList();
    packageList.Add(resource);
    package.Resources = packageList.ToArray();
    

    为什么会这样?

    4 回复  |  直到 14 年前
        1
  •  5
  •   Rex M    14 年前

    ToList() 基于原始数组创建一个完全不同的新列表。

    LINQ是只读的;语言集成 查询 -它只是查询数据,而不是修改数据。所有LINQ方法都会产生一个 投影 -例如,他们将原始序列投影到一个新的序列中,所以您总是在努力克服这个问题。

        2
  •  3
  •   Rob    14 年前

    当你打电话 package.Resources.ToList().Add(resouce); ,其功能与执行此操作相同:

    var resourcesAsList = new List<WhateverTypeResourcesContains>();
    foreach(var item in package.Resources)
    {
        resourcesAsList.Add(item);
    }
    var resourcesAsList.Add(resouce);
    

    这意味着什么 package.Resources 尚未修改,您已创建 List<T> 包含包中的每个项。包含的资源。

        3
  •  2
  •   Community Alex Howansky    7 年前

    在什么上发泄 Rex said 当你打电话 .ToList() 在一个数组对象上,您所说的是“让我成为一个全新的 List 对象,它是与原始数组不同的引用,但使用原始数组中的对象作为列表中的对象。”

    因为数组的大小是固定的,所以没有办法 Add() 不将现有数组复制到容量增加的新数组(甚至 ReDim Preserve 在VB世界中,复制场景后面的数组)。

    因此,如果在实例化数组时不知道数组中的项目总数,那么应该问自己为什么要使用数组。当您知道项的数目或当您从现有的 IEnumerable ,数组可以是保存对象集合的一种相当轻的方法。但是,如果在运行时之前不知道容量,并且源不是 可枚举的 A 这可能是一个更好的选择,因为它的构建目的是随着项目的添加而增加容量。

    我将以下集合类型用作类中的属性:

    • 可枚举的
      • 我用 可枚举的 当我将要对已经存在的集合进行迭代时,我不会将其添加到集合中。例如,如果我查询一个目录中的文件,并希望将这些文件作为类中的一个属性,我可能会使用 public IEnumerable<FileInfo> DirectoryFiles {get; set;} .
      • 可枚举的 允许我查询现有的数据集,但我不必关心它是什么集合,只要它实现 可枚举的 .
    • List<T>
      • 我用 列表& T; 当我需要一个可以动态增长或收缩的集合时,即该集合不可能存在于其他地方,我可能需要从中添加或删除项。
      • 如果允许用户向应用程序用户界面的列表框中添加和删除项,则可能是一个很好的例子。由于列表框中的项目可能会增长或收缩,因此 列表& T; 有道理。
    • ObservableCollection<T>
      • 我在Silverlight/WPF世界中使用这种类型的集合,因为它具有内置事件,用于集合中项目数更改时的事件。当您希望UI元素在列表更改时自动更新时,这对于数据绑定场景特别方便。

    我几乎从不显式使用数组,除非我消费的对象已经有数组。当然,它们是存储集合的一种很好的轻量级方法,但我通常可以通过上面列出的3种类型来处理。

        4
  •  1
  •   Paul Ruane    14 年前

    财产 Resources 正在返回 IEnumerable . Enumerable.ToList() 建立一个 新的 从这里列出 可枚举的 . 然后,您将向新列表中添加一个项,而不是原始集合 资源 正在访问,因此您的更新没有影响。