Подтвердить что ты не робот

Код для добавления в IEnumerable

У меня есть счетчик вроде этого

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

Как я могу добавить страницу (например: D:\newfile.txt)? Я пробовал Add, Append, Concat и т.д. Но для меня ничего не работало.

4b9b3361

Ответ 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 });
        }
    }
}

Ответ 2

IEnumerable<T> не содержит способа изменения коллекции.

Вам нужно будет реализовать либо ICollection<T>, либо IList<T>, поскольку они содержат функции добавления и удаления.

Ответ 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, вероятно, не ожидает, что коллекция будет изменена таким образом.

Ответ 4

IEnumerable<T> - это интерфейс только для чтения. Вместо этого вы должны использовать IList<T>, который предоставляет методы для добавления и удаления элементов.

Ответ 5

IEnumerable является неизменным. Вы не можете добавлять элементы, вы не можете удалять элементы.
Классы из System.Collections.Generic возвращают этот интерфейс, чтобы вы могли перебирать элементы, содержащиеся в коллекции.

Из MSDN

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

См. здесь для ссылки MSDN.

Ответ 6

Вы не можете добавлять элементы в 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.

Ответ 7

Try

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);