3

ActionItemオブジェクトのリストが2つあります。

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
}

MachineIdとPackageIdのみを考慮して、ListAとListBの2つのリストに参加したいと思います。

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

問題は、ListAにすべてのオブジェクトのデータが入力されていない可能性があることです。たとえば、次のようになります。

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

残りはデフォルト値になります。

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

したがって、次の1行の結果を取得したいと思います:machineId = 19、packageId = "abc"、StartTime="2/3/2012"。

ListAに情報がないため、Union操作を実行すると、1行ではなく2行が返されます。結果がListBから情報を返すようにしたいと思います(ListBには常により多くの情報があるため、ListBにそのアイテム(machineId、packageId)がない場合を除きます)は、machineIdとpackageIdでのみ動作します。

ありがとう

4

1 に答える 1

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には、アイテムごとに組み合わされた情報があります。

于 2013-03-25T13:16:57.320 に答える