我有一个像这样的调查员
IEnumerable<System.Windows.Documents.FixedPage> page;
如何添加页面(例如:D:\ newfile.txt)?我尝试了Add
,Append
,Concat
等但是没有任何对我有用。
答案 0 :(得分:8)
IEnumerable<T>
不包含修改集合的方法。
您需要实施ICollection<T>
或IList<T>
,因为它们包含添加和删除功能。
答案 1 :(得分:7)
是的,有可能
可以将序列(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 :(得分:6)
如果你知道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都可能不会期望这样修改集合。
答案 3 :(得分:5)
IEnumerable<T>
是一个只读接口。您应该使用IList<T>
代替,它提供了添加和删除项目的方法。
答案 4 :(得分:1)
IEnumerable
是不可变的。您无法添加项目,也无法删除项目
System.Collections.Generic
中的类返回此接口,因此您可以迭代集合中包含的项目。
来自MSDN
Exposes the enumerator, which supports a simple iteration over a collection of a specified type.
有关MSDN参考,请参阅here。
答案 5 :(得分:1)
您无法向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
。
答案 6 :(得分:1)
尝试
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);