如何在C#中向IEnumerable添加元素

本文关键字:IEnumerable 添加 元素 中向 | 更新日期: 2023-09-27 18:19:29

我有以下代码:

      var contentTypes =
          (
              from contentType in this._contentTypeService.GetContentTypes()
              select new
              {
                  id = contentType.ContentTypeId,
                  name = contentType.Name
              }
          );

如何向contentTypes添加另一个id为99、名称为"All"的元素?

我试图使用contentTypes.Add(

但智能感知似乎不允许这样做。

如何在C#中向IEnumerable添加元素

您不能添加到IEnumerable<T>IEnumerable<T>s表示可以迭代的序列;它们并不代表你可以添加到的集合。你可以做的是连接到序列的末尾,获得一个新的序列:

var sequence = contentTypes.Concat(
                   new[] {
                       new { id = 99, name = "All" }
                   }
               );

现在,如果您对sequence进行迭代,您将首先看到流式传输给您的contentTypes的元素,然后最后一项将是附加项new { id = 99, name = "All" }

您可以将新值连接到IEnumerable<>的末尾。

var contentTypes =
   (
      from contentType in new[]{new {ContentTypeId = 1, Name="TEST"}}
      select new
      {
          id = contentType.ContentTypeId,
          name = contentType.Name
      }
   ).Concat(new[]{new {id = 99, name="All"}});

生成的IEnumerable将以99/All 结束

如果使用contentTypes.ToList(),则可以添加到该列表中,但这样做会创建集合的新实例,因此实际上不会修改源集合。

试试这个-

var contentTypes =
          (
              from contentType in this._contentTypeService.GetContentTypes()
              select new
              {
                  id = contentType.ContentTypeId,
                  name = contentType.Name
              }
          ).ToList();

当您已经将contentTypes转换为List时,它应该允许您向其中添加一个新项目。

首先,不能在IEnumerable<T>上使用IList.Add。所以你需要创建一个新的集合。

您正在选择一个匿名类型,请使用Concat将一个固定的匿名类型添加到您的查询中:

var allTypes = new[]{new { id = 99, name = "All" }};    // creates a fixed anonymous type as `IEnumerable<T>`
var contentTypes = from contentType in this._contentTypeService.GetContentTypes()
                   select new
                   {
                       id = contentType.ContentTypeId,
                       name = contentType.Name
                   };
var result = allTypes.Concat(contentTypes).ToList(); // concat