1. ホーム
  2. c#

[解決済み】IEnumerable<T>コレクションにアイテムを追加するにはどうすればよいですか?

2022-03-24 01:02:04

質問

上記のタイトルで質問です。例えば

IEnumerable<T> items = new T[]{new T("msg")};
items.ToList().Add(new T("msg2"));

が、結局中に入っているのは1項目だけ。のようなメソッドを用意することはできますか? items.Add(item) のように List<T> ?

解決方法は?

できません。 IEnumerable<T> は、必ずしもアイテムを追加できるコレクションを表しているわけではありません。実際、コレクションを表すとは限らないのです。例えば

IEnumerable<string> ReadLines()
{
     string s;
     do
     {
          s = Console.ReadLine();
          yield return s;
     } while (!string.IsNullOrEmpty(s));
}

IEnumerable<string> lines = ReadLines();
lines.Add("foo") // so what is this supposed to do??

ただし、できることは 新しい IEnumerable オブジェクト (型は不定) を作成し、それを列挙すると、古いオブジェクトのすべての項目と、独自の項目のいくつかを提供することになります。このオブジェクトは Enumerable.Concat を使用します。

 items = items.Concat(new[] { "foo" });

これは は配列オブジェクトを変更しません。 (いずれにせよ、配列に項目を挿入することはできません)。しかし、配列のすべての項目をリストアップする新しいオブジェクトを作成し、次に "Foo"を作成することになります。さらに、その新しいオブジェクトは 配列の変更を追跡する (つまり、列挙するたびに、項目の現在の値が表示されます)。