このような列挙子があります
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のrealタイプを判断するのに役立ちます。
ただし、これはおそらく良い方法ではありません... 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リファレンスについては、 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
を使用できます。
試してみる
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);