合并来自多个来源的不同类

时间:2018-06-26 12:05:30

标签: c#

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

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将是相同的。理论上,firstnamelastname也应该相同。因此,如果只使用第一个,那很好(如果有所不同)。

现在我想将对象合并在一起,以便获得唯一用户列表。但是这两个对象的所有字段(所以我可以将其返回为JSON)

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

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

4 个答案:

答案 0 :(得分:3)

这是一种方法。您可以选择处理一个列表中没有的项目。

词典用于提高性能。

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     
} 

答案 1 :(得分:1)

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

        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

答案 2 :(得分:0)

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,从两个实体中选择属性。

答案 3 :(得分:0)

您也可以尝试:

  • 将列表转换为包含类型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相同,则FirstnameLastname属性也应该相同。

相关问题