У меня есть счетчик вроде этого
IEnumerable<System.Windows.Documents.FixedPage> page;
Как я могу добавить страницу (например: D:\newfile.txt)? Я пробовал Add
, Append
, Concat
и т.д. Но для меня ничего не работало.
У меня есть счетчик вроде этого
IEnumerable<System.Windows.Documents.FixedPage> page;
Как я могу добавить страницу (например: D:\newfile.txt)? Я пробовал Add
, Append
, Concat
и т.д. Но для меня ничего не работало.
Да, возможно
Можно объединить последовательности (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 });
}
}
}
IEnumerable<T>
не содержит способа изменения коллекции.
Вам нужно будет реализовать либо ICollection<T>
, либо IList<T>
, поскольку они содержат функции добавления и удаления.
Если у вас есть представление о том, что такое оригинальный тип 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, вероятно, не ожидает, что коллекция будет изменена таким образом.
IEnumerable<T>
- это интерфейс только для чтения. Вместо этого вы должны использовать IList<T>
, который предоставляет методы для добавления и удаления элементов.
IEnumerable
является неизменным. Вы не можете добавлять элементы, вы не можете удалять элементы.
Классы из System.Collections.Generic
возвращают этот интерфейс, чтобы вы могли перебирать элементы, содержащиеся в коллекции.
Из MSDN
Exposes the enumerator, which supports a simple iteration over a collection of a specified type.
См. здесь для ссылки MSDN.
Вы не можете добавлять элементы в 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
.
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);