foreachなしでリストからリストにアイテムをコピーするにはどうすればよいですか?


回答:


555

あなたはこれを試すことができます:

List<Int32> copy = new List<Int32>(original);

または、C#3と.NET 3.5を使用していて、Linqでこれを行うことができます。

List<Int32> copy = original.ToList();

14
アイテムがではMyClassなくタイプである場合、アイテムもIntegerコピーしますか、それとも単に参照しますか?
ペドロモレイラ

6
非プリミティブ型では機能しません。List <StudentClass>コピー=新しいList <StudentClass>(lstStudentClass);
2015

4
それは限り、すべてのタイプで動作しlstStudentClassているIEnumerable<StudentClass>、それが動作します。それ以外の場合は、さらに情報を提供する必要があります。
Lasse V. Karlsen、2015

1
(元の)の意味は何ですか?終了時
Rahul Chaudhari、2015

1
コレクションをリストのコンストラクターに渡すと、コンストラクターはそのコレクションのすべての要素を新しく作成されたリストにコピーします。
Lasse V. Karlsen、2015

170

あるリストの内容を既存の別のリストに追加するには、次のように使用できます。

targetList.AddRange(sourceList);

リストの新しいコピーを作成するだけの場合は、Lasseの回答を参照してください。


6
@mrmillsy:まあ、彼らは別のことをします。私の答えは、「既にリストがあり、それにリストをコピーしたい」に焦点を当てています
Jon Skeet

そうだね。とにかく、私の質問はおそらく新しい質問に適しています。返信ありがとうございます。
mrmillsy 2013年

1
既存のリストの内容を完全に置き換える場合は、最初にtargetList.Clear()を呼び出します。
イブラヒーム2013

33

要素のリスト

List<string> lstTest = new List<string>();

lstTest.Add("test1");
lstTest.Add("test2");
lstTest.Add("test3");
lstTest.Add("test4");
lstTest.Add("test5");
lstTest.Add("test6");

すべての要素をコピーしたい場合

List<string> lstNew = new List<string>();
lstNew.AddRange(lstTest);

最初の3つの要素をコピーする場合

List<string> lstNew = lstTest.GetRange(0, 3);

5

これは、単一のプロパティを別のリストにコピーする必要がある場合です。

targetList.AddRange(sourceList.Select(i => i.NeededProperty));

4

このメソッドはリストのコピーを作成しますが、タイプはシリアライズ可能でなければなりません。

使用する:

List<Student> lstStudent = db.Students.Where(s => s.DOB < DateTime.Now).ToList().CopyList(); 

方法:

public static List<T> CopyList<T>(this List<T> lst)
    {
        List<T> lstCopy = new List<T>();
        foreach (var item in lst)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, item);
                stream.Position = 0;
                lstCopy.Add((T)formatter.Deserialize(stream));
            }
        }
        return lstCopy;
    }

シリアル化により、パフォーマンスが大幅に低下しますか?
Dan Def

0

これはうまくいきます。上記の提案から、GetRange()は引数としてリストを使用しても機能しません...上記の投稿から少し甘くします:(みんなに感謝します:)

/*  Where __strBuf is a string list used as a dumping ground for data  */
public List < string > pullStrLst( )
{
    List < string > lst;

    lst = __strBuf.GetRange( 0, __strBuf.Count );     

    __strBuf.Clear( );

    return( lst );
}

2
これも答えではありません。
Maciej Jureczko 2017

うーん... [OK]だけでなく、単に私が提供する最良の答えをクリーンアップしている...とプレストちょっと...それは動作します:) 17ヴィスではない作業を行う上での提案のいくつか
ジム・スティーブンス

0

forループなしでlinqによって異なるリストのセットを簡単にマッピング

var List1= new List<Entities1>();

var List2= new List<Entities2>();

var List2 = List1.Select(p => new Entities2
        {
            EntityCode = p.EntityCode,
            EntityId = p.EntityId,
            EntityName = p.EntityName
        }).ToList();

-9

ここでは別の方法ですが、他の方法に比べて少し悪いです。

List<int> i=original.Take(original.count).ToList();

24
どうしてそうするか?なぜToList()直接しないのですか?
nawfal 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.