2017-02-22 24 views
-1

У меня есть следующие классы:Создать коллекцию объектов, которая имеет свойство типа коллекции с помощью Linq

public class File 
{  public string FileId; 
     public <Batch> Batches; 
     public decimal Amount; 
} 

public class Batch 
{  public string FileId; 
     public string BatchCode; 
     public decimal Amount; 
} 

Я хочу создать следующий выходной объект:

public class SummaryFile 
{ 
    public List<File> Files; 
} 

Теперь у меня есть следующие список класса Batch:

List<Batch> batches; 

Теперь этот список будет выглядеть следующим образом:

batches[0] = new Batch{ FileId = 1, BatchCode = "A", Amount = 5 }; 
batches[1] = new Batch{ FileId = 1, BatchCode = "B", Amount = 10 }; 
batches[2] = new Batch{ FileId = 2, BatchCode = "C", Amount = 22 }; 

Мой выход объекта является следующее:

public class SummaryFile 
    { 
     public List<File> Files; 
    } 

Я ожидал бы мой выход, чтобы выглядеть следующим образом:

"Files": [ 
    { 
     "FileId": "1", 
     "Batches": [ 
    { 
     "BatchCode": "A", 
     "Amount": 5 
    }, 
    { 
     "BatchCode": "B", 
     "Amount": 10 
    }, 
    ],    
    "FileAmount": 15, 
    }, 
{ 
     "FileId": "2", 
     "Batches": [ 
    { 
     "BatchCode": "C", 
     "Amount": 22 
    }, 
],    
    "FileAmount": 22 
} 
] 

возможно осуществить это с помощью Linq, если не то, что это лучший способ достичь этого? Исходя из мэйнфрейма, я бы использовал обработку прерывания для выполнения этого. спасибо за любую помощь.

ответ

1
var summaryFile = new SummaryFile 
{ 
    Files = batches.GroupBy(p => p.FileId) 
        .Select(p => new File 
        { 
         FileId = p.Key, 
         Batches = p.ToList(), 
         Amount = p.Sum(x => x.Amount) 
        }).ToList() 
}; 
+0

Это сработало для меня, большое спасибо за отзывы. – Jason