我有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
将是相同的。理论上,firstname
和lastname
也应该相同。因此,如果只使用第一个,那很好(如果有所不同)。
现在我想将对象合并在一起,以便获得唯一用户列表。但是这两个对象的所有字段(所以我可以将其返回为JSON)
最终对象(如果用户同时存在于两个源中,则看起来像这样)
public class UserC
{
String Firstname;
String Lastname;
String Upn;
String Id;
String MemberOf;
String SamAccountName
}
答案 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
相同,则Firstname
和Lastname
属性也应该相同。