2016-07-08 23 views
-1

我找到了很多关于如何比较两个列表使用除了但我找不到任何解释如何比较两个列表的属性。查找列表<T>属性和列表之间的三角洲<T><T>

我有两个模型

FruitBasket 
{ 
    ...... 
    public int[] Fruit {get; set;} 
} 

Fruit 
{ 
    public int Id {get; set;} 
    ...... 
} 

FruitBasket.Fruit属性具有数字的数组对应于Fruit.Id。但是,我需要清除FruitBaskets中的孤儿。

例如FruitBasket.Fruit将包含1,2,3,4,5,但只会有一个水果1个,水果2,水果3.所以,我需要找到在​​4,5和纠正​​。

我写了一个丑陋的双ForEach循环通过FruitBasketsFruit试图找到三角洲和我越来越离谱的结果,因为我只是没有足够的智慧来弄明白。

List<int> missing = new List<int>(); 

foreach (var basket in lstBaskets) 
{ 
    foreach (var frt in lstFruits) 
    { 
     if (!basket.Fruit.Contains(frt.Id)) 
     { 
     missing.Add(frt.Id); 
     } 
    } 
} 

此外,作为一个更优雅的方式来实现这一目标吗?这肯定是一种常见的商业需求,并且有一种高效的方式来实现它?


注意,一个是列表属性(FruitBaskets.Fruit)正在相比,水果这仅仅是一个列表。

+3

是'lstBaskets'一个'名单'? 'lstFruits'是'列表'?您可以使用SelectMany来压扁集合。使用这个:'missing = lstBaskets.SelectMany(s => s.Fruit).Select(s => s.Id).Except(lstFruits.select(s => s.Id))。ToList()' – user2023861

+0

所以你只是想找到列表差异? – Jacobr365

+0

我需要更新OP来澄清和标题。我实际上将名单财产与名单比较。 – GPGVM

回答

2

既然你有集合的集合,你可以使用到的SelectMany扁平化嵌套集合:

List<int> missing = lstBaskets 
    .SelectMany(s => s.Fruit) 
    .Select(s => s) 
    .Except(lstFruits.Select(s => s.Id)) 
    .ToList(); 
+0

我遇到第二个Select lambda Select(s => s.Id)它实际上没有看到任何属性。第一个SelectMany将其展平,但没有ID然后选择。 FruitBaskets中的Fruit是一个int数组。我改变了这一点,因为我们可以去除了只有我失去零记录是错误的。 列表缺少= lstAlbums .SelectMany(S => s.images) 。除(lstImages.Select(S => s._id)) .ToList(); – GPGVM

+0

OH Cool s => s是代表它的一种方式! – GPGVM

+0

@GPGVM,我犯了一个小错误。如果FruitBasket包含一个Fruit对象数组而不是一个整数数组,我的原始答案会起作用。我删除了'.Id'并更新了我的答案。它适用于你现在的期望。 – user2023861

相关问题