2013-03-01 263 views
0

我有3個列表cab類型。我需要比較listAlistB。如果Car-numberstatuslistBlistA中的相同,那麼我必須在listBlistC' else add it to listA . I need to perform that same operation for all rows for listB`中加上那一行。我如何在兩個列表上編寫lambda來執行此操作?Lambda來比較兩個列表

這是我到目前爲止的代碼:

public class cab 
{ 
    public string Name {get;set;} 
    public string Desc {get;set;} 
    public int Car_number {get;set;} 
    public bool status {get;set;} 

} 
cab c1 = new cab() { Name = "Zen",Desc = "äsdasdf",Car_number= "8832",status="false"}; 
cab c2 = new cab() { Name = "Ford",Desc = "sdfgedasdf",Car_number= "1132",status="true"}; 
cab c3 = new cab() { Name = "Swift",Desc = "sdsdf",Car_number= "732",status="true"}; 

List<cab> listA = new List<cab>(); 

listA.Add(c1); 
listA.Add(c2); 
listA.Add(c3); 


List<cab> listB = new List<cab>(); 
cab c4 = new cab() { Name = "Santro",Desc = "iisdasdf",Car_number= "8832",status="false"}; 
cab c5 = new cab() { Name = "Ritz",Desc = "esddf",Car_number= "132",status="true"}; 

listB.Add(c4); 
listB.Add(c5); 
List<cab> listC = new List<cab>(); 
+2

你有什麼嘗試?你有沒有使用更傳統的迭代方法?如果你只是學習LINQ,那麼你至少應該從那裏開始,即使你希望在某個時候有一個LINQ解決方案。 – Servy 2013-03-01 05:25:51

+0

將有助於至少獲得正確的數據類型: 'Car_number =「8832」' – 2013-03-01 05:30:27

回答

2

任何具體原因需要拉姆達?

這會適合你嗎?

foreach (var bItem in listB) 
{ 
    if (listA.Any(aItem => bItem.Car_number == aItem.Car_number || bItem.status == aItem.status)) 
     listC.Add(bItem); 
    else 
     listA.Add(bItem); 
} 
+0

非常感謝! – user1799214 2013-03-07 04:38:00

0
listB.ForEach(b => 
    { 
     if (listA.Any(a => a.Car_number == b.Car_number || a.status == b.status)) 
     { 
     listC.Add(b); 
     } 
     else 
     { 
     listA.Add(b); 
     } 
    } 
); 
0

如果你真的想要的lambda表達式,試試這個:

public static void ChoiseAndAdd(Cab cab,ref List<Cab> listA,ref List<Cab> listC) 
    { 
     if (listA.Any(e => e.Car_number == cab.Car_number) || listA.Any(e => e.status == cab.status)) 
     { 
      listC.Add(cab); 
      return; 
     } 
     listA.Add(user); 
    } 

和表達:

listB.ForEach(e => ChoiseAndAdd(e, ref listA, ref listC)); 
0
//Populate list C 
listC = listA.Where(a=> listB.Select(b=>b.Car_number).Contains(a.Car_number) && listB.Select(b => b.status).Contains(a.status)).ToList(); 
//Populate ListB using ListC 
listB.AddRange(listA.Where(a => ! listC.Select(c => c.Car_number).Contains(a.Car_number) && ! listC.Select(c => c.status).Contains(a.status)).ToList()); 

注:我偶然發現這裏有類似的問題,並澄清我的懷疑使用您的代碼。我知道這是一個古老的問題,答案已經提供(並被接受)。但我想我會爲其他可能來這裏尋找答案的人發佈上述解決方案。