簡體   English   中英

將一個對象的兩個列表合並為一個

[英]Combining two Lists of an Object into one

我目前正在開發需要此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合並兩個列表不會產生所需的結果。 多謝您的協助。

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)));

由於您的集合可能沒有一對一的對應關系,因此您必須進行完全外部聯接。 請參閱此處 ,了解如何以這種方式編寫它。

這是獲得相似結果的一種方法。

從兩個集合中收集所有鍵(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,
    };

.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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM