web-dev-qa-db-ja.com

IEnumerableに追加するためのコード

このような列挙子があります

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

ページ(例:D:\ newfile.txt)を追加するにはどうすればよいですか? AddAppendConcatなどを試しましたが、何もうまくいきませんでした。

22
Sudha

はい、可能です

シーケンス(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 });
        }
    }
}
7
Matthew Watson

IEnumerable<T>には、コレクションを変更する方法が含まれていません。

これらには追加機能と削除機能が含まれているため、ICollection<T>またはIList<T>のいずれかを実装する必要があります。

8
Mark Broadhurst

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を提供したものはすべて、コレクションがそのように変更されることをおそらく期待していません。

6
Steve

IEnumerable<T>は読み取り専用インターフェイスです。代わりにIList<T>を使用する必要があります。これは、アイテムを追加および削除するためのメソッドを提供します。

5
Fredrik Mörk

IEnumerableは不変です。アイテムを追加したり、アイテムを削除したりすることはできません。
System.Collections.Genericのクラスはこのインターフェイスを返すため、コレクションに含まれるアイテムを反復処理できます。

MSDNから

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

MSDNリファレンスについては、 here を参照してください。

1
bash.d

追加操作をサポートしていないため、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を使用できます。

1
Ivaylo Slavov

試してみる

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