Reputation: 2726
How to copy all from one list of object to another one. Both objects are with the same structure but with different name.
Here is the code:
class Program
{
static void Main(string[] args)
{
List<Test> lstTest = new List<Test>();
List<Test2> lstTest2 = new List<Test2>();
lstTest.Add(new Test { Name = "j", Score = 2 });
lstTest.Add(new Test { Name = "p", Score = 3 });
lstTest2 = lstTest.ConvertAll(x => (Test)x);
}
}
class Test
{
private string name;
private int score;
public string Name
{
get { return name; }
set { this.name = value; }
}
public int Score
{
get { return score; }
set { this.score = value; }
}
}
class Test2
{
private string name;
private int score;
public string Name
{
get { return name; }
set { this.name = value; }
}
public int Score
{
get { return score; }
set { this.score = value; }
}
}
Error that I get is
Cannot implicitly convert type
System.Collections.Generic.List<Test>
toSystem.Collections.Generic.List<cTest2>
Upvotes: 1
Views: 1410
Reputation: 33387
If you do not want to use automapper or other mapping tools, you can do this like this using select and new instance then return a list:
lstTest2 = lstTest.Select(e => new Test2()
{
Score = e.Score,
Name = e.Name
}).ToList();
In case of Automapper you can do something like:
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<Test, Test2>();
});
IMapper iMapper = config.CreateMapper();
lstTest2 = iMapper.Map<List<Test>, List<Test2>>(lstTest);
in config you define the type conversion. The map it from one to the other type.
You can of course extend your implementation to make it generic.
Documentation reference:
Upvotes: 3
Reputation: 4966
You are trying to convert implicitly Test
to Test2
objects. A simple way to correct your code is to construct Test2
objects:
lstTest2 = lstTest.ConvertAll(x => new Test2 { Name = x.Name, Score = x.Score });
Even if the underlying structure is identical, you cannot cast from Test
to Test2
. If you want to cast explicitly, you have to define a cast operator:
class Test2 {
// all code of class Test2
public static explicit operator Test2(Test v)
{
return new Test2 { Name = v.Name, Score = v.Score };
}
}
Then you can cast in ConvertAll
:
lstTest2 = lstTest.ConvertAll(x => (Test2)x);
Upvotes: 2
Reputation: 419
Instead of having two completely different objects with different names, study how to do object inheritance.
class Program
{
static void Main(string[] args)
{
List<TestBase> lstTest = new List<TestBase>();
lstTest.Add(new Test { Name = "j", Score = 2 });
lstTest.Add(new Test2 { Name = "p", Score = 3 });
}
}
class TestBase
{
private string name;
private int score;
public string Name
{
get { return name; }
set { this.name = value; }
}
public int Score
{
get { return score; }
set { this.score = value; }
}
}
class Test : TestBase { }
class Test2 : TestBase { }
Upvotes: -2