代码添加到了IEnumerable(Code for adding to IEnumerable)

2019-08-19 00:23发布

我有一个这样的枚举

IEnumerable<System.Windows.Documents.FixedPage> page;

我怎样才能添加页面(:d:如\ newfile.txt)呢? 我曾尝试AddAppendConcat等,但没有为我工作。

Answer 1:

对的,这是可能的

是可能的串联序列(IEnumerables)一起和连接后的结果分配给一个新的序列。 (您不能更改原始序列。)

内置Enumerable.Concat()将只串联另一个序列; 然而,很容易编写扩展方法,可以让你连接一个标量的序列。

下面的代码演示:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
    public class Program
    {
        [STAThread]
        private static void Main()
        {
            var stringList = new List<string> {"One", "Two", "Three"};

            IEnumerable<string> originalSequence = stringList;

            var newSequence = originalSequence.Concat("Four");

            foreach (var text in newSequence)
            {
                Console.WriteLine(text); // Prints "One" "Two" "Three" "Four".
            }
        }
    }

    public static class EnumerableExt
    {
        /// <summary>Concatenates a scalar to a sequence.</summary>
        /// <typeparam name="T">The type of elements in the sequence.</typeparam>
        /// <param name="sequence">a sequence.</param>
        /// <param name="item">The scalar item to concatenate to the sequence.</param>
        /// <returns>A sequence which has the specified item appended to it.</returns>
        /// <remarks>
        /// The standard .Net IEnumerable extensions includes a Concat() operator which concatenates a sequence to another sequence.
        /// However, it does not allow you to concat a scalar to a sequence. This operator provides that ability.
        /// </remarks>

        public static IEnumerable<T> Concat<T>(this IEnumerable<T> sequence, T item)
        {
            return sequence.Concat(new[] { item });
        }
    }
}


Answer 2:

IEnumerable<T>不包含一个的方式来修改该集合。

你将需要实现两种ICollection<T>IList<T>因为这些含有添加和删除功能。



Answer 3:

如果您有什么样的原始类型了IEnumerable的是一个想法,你可以修改它...

List<string> stringList = new List<string>();
stringList.Add("One");
stringList.Add("Two");
IEnumerable<string> stringEnumerable = stringList.AsEnumerable();
List<string> stringList2 = stringEnumerable as List<string>;

if (stringList2 != null)
    stringList2.Add("Three");

foreach (var s in stringList)
    Console.WriteLine(s);

这种输出:

One
Two
Three

更改foreach语句来遍历stringList2 ,或stringEnumerable ,你会得到同样的事情。

反射可能是确定真正的类型了IEnumerable的有用。

这可能不是一个很好的做法,但...无论给你了IEnumerable可能是不希望集合进行修改的方式。



Answer 4:

IEnumerable<T>是一个只读接口。 则应使用IList<T>代替,它提供用于添加和删除的项目的方法。



Answer 5:

IEnumerable是不可改变的。 您不能添加项目,则无法删除项目。
从类System.Collections.Generic返回此界面,您可以遍历集合中包含的项目。

从MSDN

Exposes the enumerator, which supports a simple iteration over a collection of a specified type.

见这里的MSDN参考。



Answer 6:

尝试

IEnumerable<System.Windows.Documents.FixedPage> page = new List<System.Windows.Documents.FixedPage>(your items list here)

要么

IList<System.Windows.Documents.FixedPage> page = new List<System.Windows.Documents.FixedPage>(1);
page.Add(your item Here);


Answer 7:

您不能添加元素IEnumerable<T>因为它不支持加法运算。 你要么必须使用的实现ICollection<T>或施放IEnumerable<T>ICollection<T>如果可能的话。

IEnumerable<System.Windows.Documents.FixedPage> page;
....
ICollection<System.Windows.Documents.FixedPage> pageCollection 
    = (ICollection<System.Windows.Documents.FixedPage>) page

如果转换是不可能的,使用例如

ICollection<System.Windows.Documents.FixedPage> pageCollection 
   = new List<System.Windows.Documents.FixedPage>(page);

你可以像下面这样做:

ICollection<System.Windows.Documents.FixedPage> pageCollection
    = (page as ICollection<System.Windows.Documents.FixedPage>) ??
      new List<System.Windows.Documents.FixedPage>(page);

后者几乎将保证你有一个集合,是可以修改的。 这是可能的,但是,使用时投,顺利拿到集合,但所有的修改操作抛出NotSupportedException 。 这是所以只读集合。 在这种情况下,用构造的方法是唯一的选择。

ICollection<T>接口实现IEnumerable<T>所以你可以使用pageCollection无论你正在使用page



文章来源: Code for adding to IEnumerable