将两个对象列表合并为一个

时间:2015-02-28 16:20:01

标签: c# list generic-list

我目前正在开发一个需要这个senario的应用程序。

假设我有这个对象

public class ObjectItem
{
   public int Id {get;set;}
   public int Name {get;set;}
   public int Sex {get;set;}
   public int Age {get;set;}
   public string Complexion {get;set;}
}

如果我们现在有两个这个对象的列表

var studentWithAge = new List<ObjectItem>
                  {
                    new ObjectItem {Id = 1, Name = "John", Age = 2},
                    new ObjectItem {Id = 2, Name = "Smith", Age = 5},
                    new ObjectItem {Id = 3, Name = "Juliet", Age = 7},
                  };

var studentWithSexAndComplexion = new List<ObjectItem>
                       {
                          new ObjectItem {Id = 1, Name = "John", Sex = "Male", Complexion = "fair"},
                          new ObjectItem {Id = 2, Name = "Smith", Sex = "Male", Complexion = " "},
                          new ObjectItem {Id = 3, Name = "Juliet", Sex = "Female", Complexion = "Blonde"},
                          new ObjectItem {Id = 4, Name = "Shittu", Sex = "Male", Complexion = "fair"},
                       };

我想将这两个列表合并为一个。最终结果应如下所示。

var CompleteStudentData=new List<ObjectItem>
{
   new ObjectItem{Id=1,Name="John",Sex="Male", Complexion="fair",Age=2},
   new ObjectItem{Id=2,Name="Smith",Sex="Male", Complexion=" ", Age=5},
   new ObjectItem{Id=3,Name="Juliet",Sex="Female", Complexion="Blonde", Age=7},
   new ObjectItem{Id=4,Name="Shittu",Sex="Male", Complexion="fair", Age=0},
}

我如何实现这一目标?使用Union合并两个列表不会产生所需的结果。我很感激你的帮助。

3 个答案:

答案 0 :(得分:4)

var result = StudentWithAge.Join(StudentWithSexAndComplexion, 
                                 sa => sa.Id,
                                 ssc => ssc.Id,
                                 (sa, ssc) => new ObjectItem
                                 {
                                    Id = sa.Id,
                                    Name = sa.Name, 
                                    Age = sa.Age, 
                                    Sex = ssc.Sex, 
                                    Complexion = ssc.Complexion
                                 }).ToList();

或者,避免创建新对象:

var result = StudentWithAge.Join(StudentWithSexAndComplexion, 
                                 sa => sa.Id,
                                 ssc => ssc.Id,
                                 (sa, ssc) => 
                                 { 
                                    sa.Sex = ssc.Sex; 
                                    sa.Complexion = ssc.Complexion; 
                                    return sa;
                                 }).ToList();

如果您想添加仅在第二个列表中呈现的学生,而且还要:

result.AddRange(StudentWithSexAndComplexion.Where(ssc => !StudentWithAge.Any(sa => sa.Id == ssc.Id)));

答案 1 :(得分:1)

由于您的馆藏可能不会有一对一的对应关系,因此您必须进行全外连接。请参阅here,了解如何以这种方式撰写。

这是获得类似结果的一种方式。

从两个集合中收集所有键(ID),然后对每个集合执行左连接,然后合并结果。

var ids = studentWithAge.Select(s => s.Id)
    .Union(studentWithSexAndComplexion.Select(s => s.Id));
var query =
    from id in ids
    from sa in studentWithAge
                    .Where(sa => sa.Id == id)
                    .DefaultIfEmpty(new ObjectItem { Id = id })
    from ssc in studentWithSexAndComplexion
                    .Where(ssc => ssc.Id == id)
                    .DefaultIfEmpty(new ObjectItem { Id = id })
    select new ObjectItem
    {
        Id = id,
        Name = sa.Name ?? ssc.Name,
        Sex = ssc.Sex,
        Age = sa.Age,
        Complexion = ssc.Complexion,
    };

答案 2 :(得分:-1)

.Net有一个连接集合的功能:

var concatenatedCollection = StudentWithAge.Concat(StudentWithSexAndComplexion).ToList();

        var StudentWithAge = new List<ObjectItem>()
        {
            new ObjectItem{Id=1,Name="John",Age=2},
            new ObjectItem{Id=2,Name="Smith",Age=5},
            new ObjectItem{Id=3,Name="Juliet",Age=7},   
        };

        var StudentWithSexAndComplexion = new List<ObjectItem>()
        {
            new ObjectItem{Id=1,Name="John",Sex="Male", Complexion="fair"},
            new ObjectItem{Id=2,Name="Smith",Sex="Male", Complexion=" "},
            new ObjectItem{Id=3,Name="Juliet",Sex="Female", Complexion="Blonde"},
            new ObjectItem{Id=4,Name="Shittu",Sex="Male", Complexion="fair"},
        };
        var concatenatedCollection = StudentWithAge.Concat(StudentWithSexAndComplexion).ToList();