从Linq中删除与另一个子列表匹配的子列表中的项目

时间:2014-03-11 15:36:04

标签: c# linq

我有以下课程(简化):

public class SeguradoraCalculo
{
    public int CodigoSeguradora { get; set; }

    public List<Franquia> Franquias{get;set;}

}

public class Franquia {
    public int CodFranquia{get;set;}
}

我有以下数据:

 var allData = new List<SeguradoraCalculo>(){new SeguradoraCalculo(){
                        CodigoSeguradora = 11,
                        Franquias = new List<Franquia>()
                        {
                            new Franquia()
                            {                   
                                CodigoFranquia = 1
                            },
                            new Franquia()
                            {                            
                                CodigoFranquia = 2
                            }
                        }
                    }
                };

    var except = new List<SeguradoraCalculo>()
                {
                    new SeguradoraCalculo()
                    {
                        CodigoSeguradora = 11,
                        Franquias = new List<Franquia>()
                        {
                            new Franquia()
                            {                   
                                CodigoFranquia = 1
                            }
                        }
                    }
                };

我如何获得一个结果,删除与CodigoSeguradoraCodigoFranquia匹配的项目,现有的Franquias将被删除,只有当我至少有一个SeguradoraCalculo时才能获得Franquia在我的Franquias列表中?

在这个例子中,我的最终列表是:

            CodigoSeguradora = 11,
            Franquias = new List<Franquia>()
            {
                new Franquia()
                {                            
                    CodigoFranquia = 2
                }
            }

由于

1 个答案:

答案 0 :(得分:2)

首先根据键加入两个集合,然后遍历每个连接对并从第一个中删除第二个中包含的所有项目:

var query = allData.Join(except,
    item => item.CodigoSeguradora,
    item => item.CodigoSeguradora,
    (a, b) => new { a, b });

foreach (var pair in query)
    pair.a.Franquias.RemoveAll(f => 
        pair.b.Franquias.Select(x => x.CodFranquia).Contains(f.CodFranquia));