2016-12-15 3 views
0

この質問は、オブジェクトの複製についてではなく、オブジェクトのリストを複製するための拡張メソッドを使用するLinqの正しい使い方についてです。LinqとC#でのオブジェクトのクローニング

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<MyObj> myObjs = DB.GetAllMyObjs(); //fictitious database calls returns a list of Objs 


     //I now want to use my extension method clone to clone all the MyObjs in myObjs 
     // this throws an error; 
     List<MyObj> myObj2 = myObjs.ForEach(a => a.Clone()).ToList(); //ERROR = "."cannot be applied to type void 


    } 
} 

public class MyObj 
{ 
    public int Id { get; set; } 



} 
public static class MyObjExtentions 
{ 
    public static MyObj Clone(this MyObj myObj) 
    { 
     var myObjClone = new MyObj(); 
     myObjClone.Id = myObj.Id; 
     return myObjClone; 
    } 
} 

}

私は、LINQのコード上のエラーを取得しています。これを行うことが可能か、foreachループが必要ですか?

+1

あなたは拡張メソッドの代わりにICloneableを使用することを考えましたか? – maximdumont

+2

'ForEach'がLINQでないことはかなり確信しています。 – Abion47

+3

正しい。 'ForEach() 'は 'List(T)'のメソッドです。 https://msdn.microsoft.com/en-us/library/bwabdf9z(v=vs.110).aspxを参照してください。大きな違いは、すべてのLINQ拡張が何かを返し、本質的に不変であることです。 'ForEach'は反復処理されるオブジェクトを操作するために使用できます。 – Michael

答えて

6

のForEach

List<MyObj> myObj2 = myObjs.Select(a => a.Clone()).ToList(); 

Selectへの変更 ForEachは、リストの実装の一部です。 linq

関連する問題