2014-02-27 53 views
1
List<SalesRecord> SalesRecords = new List<SalesRecord>(); 
while(sr.EndOfStrem) 
{ 
    SalesRecord Sale = new SalesRecord(); 
    //assigns data to sale.pluid, sale,quantity, sale.subtotal 
    SalesRecords.Add(Sale); 
} 

foreach (SalesRecord _sale in SalesRecords) 
{ 
    foreach (SalesRecord _matchingSale in SalesRecords) 
    { 
     if (_sale.PLUId == _matchingSale.PLUId) 
     { 
       _sale.Quantity = _sale.Quantity + _matchingSale.Quantity; 
       _sale.Subtotal = _sale.Subtotal + _matchingSale.Subtotal; 
       //SalesRecords.Remove(_matchingSale); 
     } 
    } 
} 

Console.WriteLine(SalesRecords.ToList()); 

這只是輸出:邏輯運行2個循環,比較,更新,然後刪除?

Synchroniser.SalesRecord, 
Synchroniser.SalesRecord, 
Synchroniser.SalesRecord, 
Synchroniser.SalesRecord, 
Synchroniser.SalesRecord, 
Synchroniser.SalesRecord 
etc..etc..etcc 

我要輸出saleRecords的銷售?編號,數量和小計?,爲每個記錄

另外我已經commneted刪除線。因爲這會引發錯誤:集合已被修改:枚舉操作可能無法執行。

我的邏輯錯了嗎? 我想要做的是

  1. 創建一個列表。
  2. 貫穿流式閱讀器,每次運行時都會添加一個「銷售」記錄並填充,然後將其添加到SalesRecords中。
  3. 在流式播放器的末尾,使用2個循環來比較循環,因爲可能有多個記錄用於同一個pluId,例如。

輸入

PLUId Quantity Subtotal 
    1  4  4.00 
    2  2  8.50 
    3  7  3.90 
    1  3  3.00 

所以在最後我想下面outputed:

PLUId Quantity Subtotal 
    1  7  7.00 
    2  2  8.50 
    3  7  3.90 

..please建議

回答

1

我建議使用Dictionary,而不是添加將項目複製到列表中,然後將其刪除。

var SalesRecords = new Dictionary<int, SalesRecord>(); 

裏面的while循環,你可以做一個查詢:

var currentPLUId = // get the PLUId for the current record 

if (SalesRecords.ContainsKey(currentPLUId)) 
{ 
    var sale = SalesRecords[currentPLUId]; 

    // increase the quantity, subtotal fields 
} 
else 
{ 
    var sale = new SalesRecord(); 

    // set the quantity, subtotal fields 

    SalesRecords.Add(currentPLUId, sale); 
} 

而且,你要Console.WriteLine(SalesRecords.ToList());呼叫推出壞的數據,因爲你不能只通過一個完整的清單,並期待它我知道該怎麼做。你可以告訴它具體在哪些值顯示:

foreach (var sale in SalesRecords) 
    Console.WriteLine(string.Concat(
     sale.PLUId, " - " , sale.Quantity, " - ", sale.Subtotal); 

或者你可以在SalesRecord類顯示任何你想要覆蓋ToString,然後執行:

foreach (var sale in SalesRecords) 
    Console.WriteLine(sale);  // sale.ToString() is called 
0

如果你被允許使用LINQ您可以將您的PLUId和總和的數量和小計分組到一個新的集合中:

var qr = (from s1 in SalesRecords 
      group s1 by s1.PLUId into g 
      select new SalesRecord{ 
         PLUId = g.Key , 
         Quantity = g.Sum(m =>m.Quantity) , 
         Subtotal = g.Sum(m=> m.Subtotal) }) 
         .ToList(); 
Console.WriteLine("PLUId Quantity Subtotal"); 
foreach (var s in qr) 
     Console.WriteLine("{0,7} {1,9} {2,9}",s.PLUId, s.Quantity, s.Subtotal);