user3410713
user3410713

Reputation: 181

How merge two lists of different objects?

Using C# with LINQ, how can I merge two lists of different objects, say, Seminar and Conference? They have some common and some different fields/properties and do not share unique id.

class Seminar
{
   int id,
   DateTime joinDate,
   string name
}

class Conference
{
   Guid confNumber,
   DateTime joinDate
   Type type
}

I have a list of:

List<Seminar>
List<Conference>

I need to merge them into a super List:

List<Object>

A code snippet would be great help.

Upvotes: 12

Views: 40267

Answers (3)

Morteza Sefidi
Morteza Sefidi

Reputation: 105

Simple method of pure code

internal class Person
{
    public int Id { get; set; }
    public string UserName { get; set; }
}

internal class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

internal class UserPerson
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

private static void Main(string[] args)
    {
        Person[] people = new Person[3] { new Person { Id = 1, UserName = "AliUserName" }, new Person { Id = 2, UserName = "MortezaUserName" }, new Person { Id = 3, UserName = "SalarUserName" } };
        User[] users = new User[4] { new User { FirstName = "ali", LastName = "Barzegari" }, new User { FirstName = "Morteza", LastName = "Sefidi" }, new User { FirstName = "Salar", LastName = "Pirzadeh" }, new User { FirstName = "Babak", LastName = "Hasani" } };

        UserPerson[] userPeople = new UserPerson[people.Length > users.Length ? people.Length : users.Length];
        if (people.Length > users.Length)
            for (int i = 0; i < people.Length; i++)
            {
                userPeople[i] = new UserPerson
                {
                    Id = people[i].Id,
                    UserName = people[i].UserName,
                    FirstName = users.Length <= i ? "" : users[i].FirstName,
                    LastName = users.Length <= i ? "" : users[i].LastName
                };
            }
        else
            for (int i = 0; i < users.Length; i++)
            {
                userPeople[i] = new UserPerson
                {
                    Id = people.Length <= i ? 0 : people[i].Id,
                    UserName = people.Length <= i ? "" : people[i].UserName,
                    FirstName = users[i].FirstName,
                    LastName = users[i].LastName
                };
            }
        Console.ReadLine();
    }

Upvotes: 1

Durgesh Chaudhary
Durgesh Chaudhary

Reputation: 1077

Following code works fine for me, if this is your definition of Merge

One solution

List<A> someAs = new List<A>() { new A(), new A() };
List<B> someBs = new List<B>() { new B(), new B { something = new A() } };

List<Object> allS = (from x in someAs select (Object)x).ToList();
allS.AddRange((from x in someBs select (Object)x).ToList());

Where A and B are some classes as follows

class A
{
    public string someAnotherThing { get; set; }
}
class B
{
    public A something { get; set; }
}

Another Solution

List<A> someAs = new List<A>() { new A(), new A() };
List<B> someBs = new List<B>() { new B(), new B { something = string.Empty } };

List<Object> allS = (from x in someAs select (Object)new { someAnotherThing = x.someAnotherThing, something = string.Empty }).ToList();
allS.AddRange((from x in someBs select (Object)new { someAnotherThing = string.Empty, something = x.something}).ToList());

Where A and B are having class definition as

class A
{
    public string someAnotherThing { get; set; }
}
class B
{
    public string something { get; set; }
}

Upvotes: 6

Richard Deeming
Richard Deeming

Reputation: 31198

If you just want a single List<object> containing all objects from both lists, that's fairly simple:

List<object> objectList = seminarList.Cast<object>()
    .Concat(conferenceList)
    .ToList();

If that's not what you want, then you'll need to define what you mean by "merge".

Upvotes: 15

Related Questions