32

オブジェクトとオブジェクトのリストを特定の順序でリストを初期化したい。現在、私は次のことを行っています。

List<MyObject> list = new List<MyObject>();
list.Add(object1); // object1 is type MyObject
list.AddRange(listOfObjects); // listOfObjects is type List<MyObject>

私はそれを初期化ステートメントに統合することを望んでいました(もちろん構文は間違っています):

List<MyObject> newList = new List<MyObject>() { object1, listOfObjects };

これを簡潔に行う方法はありますか?

4

3 に答える 3

43

要素の順序が重要でない場合は、次を使用できます。

List<MyObject> newList = new List<MyObject>(listOfObjects) { object1 };

これList<T>は、を受け入れるコンストラクターを使用しIEnumerable<T>、次にコレクション初期化子を使用して他の項目を追加することで機能します。たとえば、次のようになります。

static void Main()
{
    int test = 2;
    List<int> test2 = new List<int>() { 3, 4, 5 };
    List<int> test3 = new List<int>(test2) { test };

    foreach (var t in test3) Console.WriteLine(t);

    Console.ReadKey();
}

印刷します:

3
4
5
2

ただし、個々のアイテムが最後に追加されるため、順序は元の順序とは異なることに注意してください。

ただし、順序が重要な場合は、個人的にリストを作成し、初期化子の最初のオブジェクトに配置して、次のように呼び出しAddRangeます。

List<MyObject> newList = new List<MyObject> { object1 };
newList.AddRange(listOfObjects);

これにより、意図が非常に明確になり、一時的なアイテム(LINQのConcatなどを使用して必要になる)の構築が回避されます。

于 2012-11-06T18:14:30.957 に答える
11

私はあなたができる最善のことは次のとおりだと思います:

List<MyObject> newList = new[] { object1 }.Concat(listOfObjects).ToList();
于 2012-11-06T18:12:19.557 に答える
3

これは、拡張メソッドの助けを借りて達成することができます。

public static class CollectionExtensions
{
    public static void Add<T>(this ICollection<T> collection, IEnumerable<T> itemsToAdd)
    {
        foreach (var item in itemsToAdd)
        {
            collection.Add(item);
        }
    }
}

使用法は、質問で提案されたとおりです。

var newList = new List<MyObject>
   {
      object1,
      listOfObjects
   };

オブジェクトとコレクションのイニシャライザーに関するC#プログラミングガイドにいくつかの説明があります(より良い単語は見つかりませんでした)。

コレクション初期化子を使用すると、IEnumerableを実装し、インスタンスメソッドまたは拡張メソッドとして適切なシグネチャを持つAddを持つコレクション型を初期化するときに、1つ以上の要素初期化子を指定できます。

于 2020-08-12T10:27:17.293 に答える