如何合并这两个列表?

时间:2016-06-07 09:16:29

标签: c# .net linq

型号:

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

我怎样才能完成它? :)

2 个答案:

答案 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)
                                });