2013-03-25 83 views
3

對象的兩個列表我ActionItem對象的兩個列表:LINQ加入/聯盟採取優先從第二在第一

ListA<ActionItem>; 
ListB<ActionItem>; 


public class ActionItem 
{ 
    #region Public Properties 

    public string ConnectionId { get; set; } 

    public int MachineId { get; set; } 

    public OperationType OperationType { get; set; } 

    public MachineOperationStatus OperationStatus { get; set; } 

    public string PackageId { get; set; } 

    public DateTime StartTime { get; set; } 

    public TabType TabType { get; set; } 

    public PageType PageType { get; set; } 

    #endregion 
} 

我想加入兩個列表利斯塔和數組listB下considiration ONLY設備ID和包標識服用。

IEnumerable<ActionItem> collection = this.ListA .Union(this.ListB); 

的問題是,利斯塔可能沒有填寫的所有對象的數據,以便例如:

ListA will have machineId = 19, packageId = "abc" 

,其餘的將是默認值。

ListB will have machineId = 19, packageId = "abc", StartTime = "2/3/2012". 

所以我想獲得1行的結果有以下: 設備ID = 19,包標識= 「ABC」,開始時間= 「2012年2月3日」。

由於ListA缺少信息,執行聯合操作會返回2行而不是1。我想結果返回ListB的信息(因爲ListB總是有更多的信息,除非ListB沒有那個item(machineId,packageId))只能在machineId和packageId上加工。

感謝

+0

檢查答案,並做這種更新可能會爲你工作.. – 2013-03-25 09:18:07

回答

2

你可以嘗試這樣的事:

//Create one list list containing all records 
    var test = listA.Union(listB); 

    //Group items based off the MachineId 
    var lookup = test.ToLookup(t => new {t.MachineId, t.PackageId}); 

    //Final List 
    var listC = new List<ActionItem>(); 

    foreach (var item in lookup) 
    { 
    var newItem = new ActionItem(); 

    newItem.MachineId = item.Key.MachineId; 
    newItem.PackageId = item.Key.PackageId; 

    newItem.ConnectionId = item.Max(i => i.ConnectionId); 
    newItem.OperationStatus = item.Max(i => i.OperationStatus); 
    newItem.OperationType = item.Max(i => i.OperationType); 
    newItem.PageType = item.Max(i => i.PageType); 
    newItem.StartTime = item.Max(i => i.StartTime); 
    newItem.TabType = item.Max(i => i.TabType); 

    listC.Add(newItem); 
    } 

listC將有每個項目的組合信息。

+0

是的,這有效。謝謝! – ShaneKm 2013-03-25 13:19:36

相關問題