型号:
public class DogOwner
{
public int OwnerId {get;set;}
public List<Dog> Dogs {get;set;}
}
和
public class CatOwner
{
public int OwnerId {get;set;}
public List<Cat> Cats {get;set;}
}
所以我已经获得了List和List,并希望将它们合并到所有者列表中:
public class Owner
{
public int OwnerId {get;set;}
public int DogsCount {get;set}
public int CatsCount {get;set;}
}
例如,如果输入数据是:
List<DogOwner>:
DogOwner Id=1 with 3 dogs
DogOwner Id=2 with 2 dogs
List<CatOwner>
CatOwner Id=5 with 2 cats
CatOwner Id=2 with 1 cat
结果应该是:
List<Owner>
Owner Id=1 CatsCount = 0, DogsCount=3
Owner Id=2 CatsCount = 1, DogsCount=2
Owner Id=5 CatsCount = 2, DogsCount=0
我怎样才能完成它? :)
答案 0 :(得分:2)
使用Linq
即可。
首先Concat
列表然后GroupBy
OwnerId
以获取猫/狗数。
var results = dogowners.Select(x=> new Owner()
{
OwnerId = x.OwnerId,
DogsCount = x.Dogs.Count()
})
.Concat(catowners.Select(x=> new Owner()
{
OwnerId = x.OwnerId,
CatsCount = x.Cats.Count()
}))
.GroupBy(x=> x.OwnerId)
.Select(x=> new Owner()
{
OwnerId = x.Key,
DogsCount = x.Sum(s=>s.DogsCount),
CatsCount = x.Sum(s=>s.CatsCount)
})
.ToList();
由于您是新手,我虽然非Linq
解决方案可能会对您有所帮助。
Non Linq
Dictionary<int, Owner> owners = new Dictionary<int, Owner>();
foreach(var dg in dogowners)
{
if(owners.ContainsKey(dg.OwnerId))
{
owners[dg.OwnerId].DogsCount += dg.Dogs.Count();
}
else
{
owners.Add(dg.OwnerId, new Owner()
{
OwnerId = dg.OwnerId,
DogsCount = dg.Dogs.Count()
});
}
}
foreach(var ct in catowners)
{
if(owners.ContainsKey(ct.OwnerId))
{
owners[ct.OwnerId].CatsCount += ct.Cats.Count();
}
else
{
owners.Add(ct.OwnerId, new Owner()
{
OwnerId = ct.OwnerId,
CatsCount = ct.Cats.Count()
});
}
}
选中此Demo
答案 1 :(得分:2)
它不漂亮,但它有效:
(关键是将DogOwner和CatOwner转换为所有者)
var results = dogOwners.Select(x => new Owner() { OwnerId = x.OwnerId, DogsCount = x.Dogs.Count })
.Union(catOwners.Select(x => new Owner() { OwnerId = x.OwnerId, CatsCount = x.Cats.Count }))
.GroupBy(x => x.OwnerId)
.Select(x =>
new Owner()
{
OwnerId = x.Key,
CatsCount = x.Sum(y => y.CatsCount),
DogsCount = x.Sum(y => y.DogsCount)
});