Выполнение действий в действиях для коллекции без создания новой коллекции

У меня есть коллекция объектов, где каждый объект содержит другие коллекции объектов. Все, что я хочу изменить мою оригинальную коллекцию объектов таким образом, чтобы не выделять дополнительную память. Все должно происходить в памяти.

Я ищу какое-то шаблонное действие или функцию, чтобы при смеси декларативного и функционального подходов не формировалась новая коллекция, а в памяти моя оригинальная коллекция также модифицировалась.

Ниже приведена иерархия коллекции

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;
    }
}

Где as мой клиент код, который является первым получением списка 10000 объектов в списке и просто сброс нескольких свойств (консигнация, адреса консигнаций для соответствующей консигнации, строки консигнаций соответствующей консигнации и packagingaid соответствующей консигнации)

Мой письменный подход к 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; });
                                  });

Возможно ли это?
Спасибо заранее.

1 ответ

  1. Это может быть написано как

    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);