2016-07-08 51 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

相關問題