我有一个这样的枚举
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<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);
您不能添加元素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
。