代码之家  ›  专栏  ›  技术社区  ›  mschuurmans

从多个源合并不同的类

c#
  •  1
  • mschuurmans  · 技术社区  · 8 年前

    我有两个用户对象(都来自不同的数据源)

    public class UserA 
    {
        String Firstname;
        String Lastname;
        String Upn;
        String Id;
    }
    
    public class UserB 
    {
        String Firstname;
        String Lastname;
        String Upn;
        String MemberOf;
        String SamAccountName
    }
    

    现在,用户x可能存在于这两个数据源中(或者可能仅存在于其中一个数据源中)。在那种情况下 upn 会是一样的。理论上 firstname 和 lastname 也应该是一样的。所以如果只使用第一个就可以了(如果有差别的话)。

    现在我想合并这些对象,这样我就得到了一个唯一用户的列表。但是这两个对象的所有字段(所以我可以将其作为json返回)

    所以最终的对象(如果用户同时存在于两个源中,则看起来像)

    public class UserC
    {
        String Firstname;
        String Lastname;
        String Upn;
        String Id;
        String MemberOf;
        String SamAccountName
    }
    
    4 回复  |  直到 8 年前
        1
  •  3
  •   Carra    8 年前

    这里有一种方法。您可以选择如何处理一个列表中不在另一个列表中的项目。

    字典用于提高性能。

    List<UserA> listA;
    List<UserB> listB;
    
    var dictA = listA.ToDictionary(x => x.Upn, x => x);
    var dictB = listB.ToDictionary(x => x.Upn, x => x);
    
    foreach(var upn in dictA.Keys.Union(dictB.Keys))
    {
       UserC user = new UserC();
       if(dictA.ContainsKey(upn)) //Fill in fields
       if(dictB.ContainsKey(upn)) //Fill in fields     
    } 
    
        2
  •  1
  •   Jaques    8 年前

    要从这两个对象中获取唯一列表,您需要这样做。又快又短。

            var uniquelist = (from aa in ListA
                            join ba in ListB on aa.Upn equals ba.Upn into all
                            from avail in all.DefaultIfEmpty()
                            where avail == null
                            select new UserC
                            {
                                Firstname = aa.Firstname,
                                Lastname = aa.Lastname,
                                Upn = aa.Upn,
                            }).ToList();
            uniquelist.AddRange(from ba in ListB
                              select new UserC
                              {
                                  Firstname = ba.Firstname,
                                  Lastname = ba.Lastname,
                                  Upn = ba.Upn,
    
                              });
    

    你可以这样添加你的加入

    join ba in b on new { aa.Upn, aa.Firstname } equals new { ba.Upn, ba.Firstname } into all
    

    然后可以使用json序列化程序将其转换为 JSON

        3
  •  0
  •   Avner Shahar-Kashtan    8 年前

    linq join语句是合并这两个列表的最佳方式,它从每对匹配的列表中创建一个新对象。

    List<UserA> first = ...
    List<UserB> second = ...
    
    from a in first
    join b in second on a.Upn equals b.Upn
    select new UserC 
           { 
             Upn = a.Upn, 
             FirstName = a.FirstName, 
             Id = a.Id, 
             SamAccountName = b.SamAccountName
           }
    

    (为了简洁起见,我把一些字段去掉了)

    这里可以看到的是一个join语句,它接受第一个用户列表,将其与第二个用户列表相匹配,其中upn字段作为键字段,然后为每对usera/userb创建一个新的userc,从两个实体中选择属性。

        4
  •  0
  •   vahdet    8 年前

    您还可以尝试:

    • 将列表转换为包含类型 UserC 我是说,
    • concat 名单,
    • groupBy 连接的列表。

    具体如下:

    var aUsers = new List<UserA>();
    var bUsers = new List<UserB>();
    // Initialize aUsers and bUsers here
    
    var aUsersAsCUsers = aUsers.Select(a => new UserC{
      Upn = a.Upn, 
      Firstname = a.Firstname, 
      Lastname = a.Lastname,
      Id = a.Id
    });
    
    var bUsersAsCUsers = bUsers.Select(b => new UserC{
      Upn = b.Upn, 
      Firstname = b.Firstname, 
      Lastname = b.Lastname,
      MemberOf = b.MemberOf,
      SamAccountName = b.SamAccountName
    });
    
    var cUsers = aUsersAsCUsers.Concat(bUsersAsCUsers)
      .GroupBy(u => u.Upn)
      .Select(c => new UserC() 
      { 
        Upn = c.Upn, 
        Firstname = c.Firstname, 
        Lastname = c.Lastname,
        Id = c.Id,
        MemberOf = c.MemberOf,
        SamAccountName = c.SamAccountName
    });
    

    如果 Upn 是一样的, Firstname 和 Lastname 属性也应该是相同的。