2016-05-29 54 views
0

我有一些對象的集合,其中每個對象都包含其他對象集合。我想以某種方式修改我的原始對象集合,不要分配額外的內存。一切都應該發生在記憶中。在動作中執行操作以進行收集而不創建新集合

我正在尋找一些模板化的Action或Func,以便通過聲明性和功能性方法的混合,不會形成新的集合,並且在內存中我的原始集合也會被修改。

以下是收集的層次

public class ConsignmentAddress 
{ 
    public int ConsignmentAddressId { get; set; } 
    public int AddressTypeId { get; set; } 
    public string Street { get; set; } 
    public string Town { get; set; } 
    public string ZipCode { get; set; } 
    public int ConsignmentId { get; set; } 


} 
public class ConsignmentLine 
{ 
    public int ConsignmentLineId { get; set; } 
    public int PackagingId { get; set; } 
    public double Amount { get; set; } 
    public double Weight { get; set; } 
    public int ConsignmentId { get; set; } 
    public int? PackagingAidId { get; set; } 


} 
public class PackagingAid 
{ 
    public int PackagingAidId { get; set; } 
    public int ConsignmentId { get; set; } 
    public int PackagingId { get; set; } 
    public double Quantity { get; set; } 
} 
public class Consignment 
{ 
    public int ConsignmentId { get; set; } 
    public int ClientSubsidiaryId { get; set; } 
    public int ForwarderId { get; set; } 
    public int Sourcepaty { get; set; } 
    public int ParentId { get; set; } 
    public int ProductId { get; set; } 

    public ICollection<PackagingAid> PackagingAids { get; set; } 
    public ICollection<ConsignmentLine> ConsignmentLines { get; set; } 
    public ICollection<ConsignmentAddress> ConsignmentAddresses { get; set; } 

    public Consignment() 
    { 
     PackagingAids = new List<PackagingAid>(); 
     ConsignmentLines = new List<ConsignmentLine>(); 
     ConsignmentAddresses = new List<ConsignmentAddress>(); 
    }   
} 

我的本意是寫應該在所有類型的我上面提到的層次結構對象的操作通用擴展方法。

public static class ConsignmentExtension 
{ 
    public static T Set<T>(this T input, Action<T> updater) 
    { 
     updater(input); 
     return input; 
    } 
} 

凡爲我的客戶端代碼是首先獲得在列表對象的10000名單,只是重新設置的幾個屬性(寄售,consignmentaddresses相應代銷,對應的相應貨物的託運和packagingaid的consignmentlines)

我寫的Foreach方法工作正常,但我希望爲相同的集合提供模板化和高效的方法。

consignments.ForEach(cons => 
     { 
             cons.ConsignmentId = -1; 
             cons.ConsignmentAddresses.ToList().ForEach(address => 
             { 
              address.ConsignmentId = -1; 
              address.ConsignmentAddressId = -1; 
             }); 
             cons.ConsignmentLines.ToList().ForEach(line => 
             { 
              line.ConsignmentId = -1; 
              line.ConsignmentLineId = -1; 
              line.PackagingAidId = -1; 
             }); 
             cons.PackagingAids.ToList().ForEach(aid => 
             { 
              aid.ConsignmentId = -1; 
              aid.PackagingAidId = -1; 
             });            
     }); 

但我在尋找類似聲明式的東西。

var updatedConsignments = from consignment in consignments 
            select consignment.Set<Consignment>(con => 
            { 
             con.ConsignmentId = -1; 
             con.ConsignmentAddresses.Set<dynamic>(address => { address.ConsignmentId = -1; address.ConsignmentAddressId = -1; }); 
             con.ConsignmentLines.Set<dynamic>(line => { line.PackagingAidId = -1; line.ConsignmentId = -1;line.ConsignmentLineId = -1; }); 
             con.PackagingAids.Set<dynamic>(aid => { aid.ConsignmentId = -1; aid.PackagingAidId = -1; }); 
            }); 

這有可能嗎? 在此先感謝。

回答

0

這可以寫成

public static class ConsignmentExtension 
{ 
    public static IEnumerable<dynamic> SetEach(this IEnumerable<dynamic> input, Action<dynamic> updater) 
    { 
     foreach (var item in input) 
     { 
      updater(item); 
     } 

     return input; 
} 

}

用法:

  var addresses = new [] 
      { 
       new ConsignmentAddress() 
      }; 

      addresses.SetEach(a => a.ConsignmentId = -1); 

      var packages = new [] 
      { 
       new PackagingAid() 
      }; 
      packages.SetEach(p => p.PackagingAidId = -1);