2016-01-29 79 views
-7

我對C#比較陌生。我想在明年的方式從列表中獲取列表:C#+從列表中獲取列表

模型數據:

string productId 
string productName 
string depotName 
int quantity 

List<Data> FullList 

例如:

PROD1 | product1 | depot1 | 1.00

prod1 | product1 | depot2 | 2.00

prod1 | product1 | depot3 | 0.00

prod2 | product2 | depot1 | 2.00

prod2 | product2 | depot2 | 5.00

我拿到名單喜歡在這之後,我想從這個在下的方式創建一個多個列表:

List<Data> NewList 

PROD1 | product1 | depot1,depot2 | 3.00

prod2 | product2 | depot1,depot2 | 7.00

我想將列表中的項目按product_id, sum(quantity)和concat字符串的庫位名稱分組。

我嘗試,並得到一些點(分組和使用GroupBy(x => x.product_id)Distinct()得到不同的值,但我不能讓sum(quantity)

有人可以幫助我。

非常感謝你。

+1

你覺得這個難以置信的帖子是個問題嗎? – Eser

+0

對不起,什麼是不可讀的?你能看到字母,我寫的文字......還是有問號或一些奇怪的數據? – user3200393

+0

發佈後你看了你的問題嗎?你在開玩笑嗎?順便說一句:我不是那個需要幫助的人。所以,傲慢的傲慢對你無能爲力。 – Eser

回答

0
var summary = FullList 
    .GroupBy(p => p.product_id) 
    .Select(g => new { 
     product_id = g.product_id, 
     product_name = g.First().product_name, 
     quantity = g.Sum(p => p.quantity) 
    }) 
    .ToList(); 

作爲練習思考讓所有的車廠名左右Concat

+0

謝謝。你的帖子很乾淨,簡短,給我答案,我尋找。 此外,我想感謝其他人的有用評論。 爲了獲取連接軟件倉庫名稱,我沒有使用Concat()。我以這種方式解決它: 'depotName = g.Select(q => q.depotName).Aggregate((e,r)=> e +「,」+ r)' – user3200393

+0

而且,因爲我只需要depot數量多於0的名稱,我補充說: 'depotName = g.Where(z => z.quantity> 0).Select(q => q.depotName).Aggregate((e,r)=> e +「,」+ r)' – user3200393

0

更新:

此實現不使用linq,但它做的工作正確。不知道有多好,存取大量數據時的性能,

代碼背後:

List<Data> data = new List<Data>() 
      { 
       new Data() { productId = "prod1", productName = "product1", depotName = "depot1", quantity = 1 }, 
       new Data() { productId = "prod1", productName = "product1", depotName = "depot2", quantity = 2 }, 
       new Data() { productId = "prod1", productName = "product1", depotName = "depot3", quantity = 0 }, 
       new Data() { productId = "prod2", productName = "product2", depotName = "depot1", quantity = 2 }, 
       new Data() { productId = "prod2", productName = "product2", depotName = "depot2", quantity = 5 }, 
      }; 

      List<Data> newData = new List<Data>(); 

      foreach(var d in data) 
      { 
       Data newDataRecord = newData.FirstOrDefault(nd => nd.productId == d.productId); 
       if (newDataRecord != null) 
       { 
        int newDataRecordIndex = newData.IndexOf(newDataRecord); 
        if(!newDataRecord.depotName.Contains(d.depotName)) 
        { 
         newData[newDataRecordIndex].depotName += string.Format(",{0}", d.depotName); // Append to the existing depotName 
        } 
        newData[newDataRecordIndex].quantity += d.quantity; // Add quantity 
       } 
       else 
       { 
        newData.Add(d); 
       } 
      } 

型號:

public class Data 
    { 
     public string productId { get; set; } 
     public string productName { get; set; } 
     public string depotName { get; set; } 
     public int quantity { get; set; } 
    } 

輸出:

PROD1 | product1 | depot1,depot2,depot3 | 3.00

prod2 | product2 | depot1,depot2 | 7.00

+0

您可以在沒有任何解釋的情況下獲得downvotes回答。 「試試這個」真的沒有用的文字回答... –

+0

好的謝謝你的提醒。我添加了一些信息 –