2016-12-15 2 views
0

Bei dieser Frage geht es nicht um das Klonen von Objekten, sondern um die korrekte Verwendung von Linq zur Verwendung einer Erweiterungsmethode zum Klonen einer Objektliste. Code nur zur Veranschaulichung.Linq und Klonen von Objekten in 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; 
    } 
} 

}

Ich erhalte einen Fehler auf dem Code Linq. Ist dies möglich oder benötigen Sie eine foreach-Schleife?

+1

Haben Sie gedacht, ICloneable anstelle einer Erweiterungsmethode zu verwenden? – maximdumont

+2

Ich bin ziemlich sicher, dass 'ForEach' nicht LINQ ist. – Abion47

+3

Korrigieren. 'ForEach() 'ist eine Methode für 'List (T)'. Siehe https://msdn.microsoft.com/en-us/library/bwabdf9z(v=vs.110).aspx. Der große Unterschied ist, dass alle LINQ-Erweiterungen etwas zurückgeben und von Natur aus unveränderbar sind. 'ForEach' kann verwendet werden, um die Objekte zu manipulieren, auf denen iteriert wird. – Michael

Antwort

6

ändern ForEach Um Select

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

ForEach ist von der Liste Implementierungsteil. nicht linq

Verwandte Themen