2013-02-02 111 views
0

我正在研究餐廳POS(Samba pos)的源代碼,並且我在打印票證時如何格式化輸出有兩個問題。排序和分組

下面的代碼收集產品標籤,製作標題,然後對標題下方的產品進行排序。

問題1:我在報頭的順序沒有任何影響,所以輸出的樣子:

主菜

牛排22,50

飲料

可樂2,00

起動

湯3,50

正確的順序應該是啓動器 - >主菜 - >甜品 - >飲料 如果我能標題的字母順序,我將幫助非常排序。我想改變組標籤分爲:1個起動器,2 Maincourse等等等等

問題2:

該產品在程序的早期階段進行分組。由於程序員的選擇,分組對我而言效果不佳。我有一個長長的清單上的機票,如:

1個可樂2,00

2×可樂4,00

有沒有辦法來組產品在這裏,讓我有:

3×可樂6,00

這裏是一段代碼:

if (template.GroupTemplate.Contains("{PRODUCT TAG}")) 
{ 
    var groups = lines.GroupBy(GetMenuItemTag); 
    var result = new List<string>(); 
    foreach (var grp in groups) 
    { 
     var grpSep = template.GroupTemplate.Replace("{PRODUCT TAG}", grp.Key); 
     result.AddRange(grpSep.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)); 
     result.AddRange(grp.SelectMany(x => FormatLines(template, x).Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries))); 
    } 
    return result; 
} 

我有噸o排序var groups。問題在於循環內文本{PRODUCT TAG}被替換爲grp.Key,因此在循環之前訂購var groups可能無效(是否需要額外的循環?)。

將產品添加到標題是在循環的第3行完成的。是否有可能在這裏分組項目?

我有傾倒整個文件位置: http://pastebin.com/qFr5wN28

編輯:

這段代碼是在ticketprinter出示車票。票看起來是這樣的:

BON 
Datum: 2-2-2013 
Tijd: 18:35  
Tafel nr.: B22  
Bon nr: 2  
------------------------------------------  
Breakfast  
- 1 Toast and Jam 1,50  
- 1 Egg, Bacon Cheese 3,99  
- 1 Toasted Bagel Cheese 2,25  
- 1 Toasted Bagel Jam 1,50  
- 2 Toast and Jam 1,50  
- 1 Egg, Bacon Cheese 3,99  
- 1 Bacon and Cheese 3,49  
- 1 Bacon and Tomato 3,49  
Deserts  
- 1 Rice Pudding 2,25  
- 1 Fruit Danish 1,50  
Main course  
- 1 Chicken Garden Wrap 5,25  
- 1 Chicken Caesar Wrap 5,75  
- 1 Canadian Wrap 6,99  
- 1 Chicken Greek Wrap 6,99 

標題是我可以添加到產品的標籤。 有幾件事情是錯誤的:文章上方的標題(沙漠,主要課程)隨機出現。我想對它們進行排序。並非所有的文章都是分組的,例如「烤麪包和果醬」。如果我可以對標題進行排序,我會稍微更改標記。所需的輸出會是這樣的:通過組

var groups = lines.GroupBy(GetMenuItemTag).OrderBy(l => l.Key); 

也環路和修改你的關鍵字的值:

------------------------------------------  
1 Breakfast  
- 3 Toast and Jam 1,50  
- 2 Egg, Bacon Cheese 3,99  
- 1 Toasted Bagel Cheese 2,25  
- 1 Toasted Bagel Jam 1,50  
- 1 Bacon and Cheese 3,49  
- 1 Bacon and Tomato 3,49  
2 Main course  
- 1 Chicken Garden Wrap 5,25  
- 1 Chicken Caesar Wrap 5,75  
- 1 Canadian Wrap 6,99  
- 1 Chicken Greek Wrap 6,99  
3 Deserts  
- 1 Rice Pudding 2,25  
- 1 Fruit Danish 1,50 
+0

我不是100%清楚你的問題,但如果'grp.Key'是一個問題,你可以在創建'groups'創建一個新的投影時添加'Select'。 –

+0

最大的問題是我沒有C#經驗:-)出現在票據上的組的順序是隨機的。這很混亂。我必須找到一種方法來對這些組進行排序,並且打印在票上的組以邏輯方式出現,如:1.首發2.主要課程3.沙漠等 –

+1

您可以使用'OrderBy'輕鬆訂購組。爲了給你更多的幫助,如果你可以用非常小的數據樣本來編輯你的問題,這些數據清楚地顯示你想要什麼,以及你的代碼目前在做什麼,這將是有用的。 –

回答

1

可以使用OrderBy像這樣爲了你的線。這可以通過爲您的組添加Select投影來完成。

var groups = lines.GroupBy(GetMenuItemTag) 
        .Select(l => new { Key = template.GroupTemplate.Replace("{PRODUCT TAG}", grp.Key) 
            , l.Value }) 
        .OrderBy(l => l.Key); 

編輯:

思考之後,我意識到我被一點點昨天啞。我認爲有以下將幫助您:

//dummy data for testing purposes 
List<Tuple<string, string>> items = new List<Tuple<string, string>>(); 
items.Add(new Tuple<string, string>("Dinner", "steak")); 
items.Add(new Tuple<string, string>("Dinner", "chicken")); 
items.Add(new Tuple<string, string>("Dinner", "chicken")); 
items.Add(new Tuple<string, string>("Desert", "chocolate")); 

var groups = (from t in items 
      group t by new {Course = t.Item1, Item = t.Item2} 
      into grp 
       select new 
       { 
        grp.Key.Course, 
        grp.Key.Item, 
        Quantity = grp.Count() 
       }) 
      .OrderBy(g => g.Course); 

foreach (var g in groups) 
      Console.WriteLine(string.Format("{0} {1} {2}", g.Course, g.Item, g.Quantity)); 

OUTPUT:

Dinner steak 1 
Dinner chicken 2 
Desert chocolate 1 

顯然,你將需要修改的數據類型等,但查詢本身應該給你你需要什麼。

+0

首先我想說我非常感謝你的幫助!我會嘗試更多地解釋我的問題。用你給我的代碼,我可以影響組頭的順序。一個組現在包含一個標題和屬於該標題的產品:softdrinks - > cola - > fanta我想要實現的是添加重複產品。所以軟飲料 - > 1 x可樂1,50 - > 1 x可樂1,50成爲軟飲料 - > 2 x可樂3,00 –

+0

我相信你現在需要第二個'GroupBy'值,然後讓你聚合他們並獲得一個「計數」。不幸的是,我沒有在這臺機器上安裝VS,所以我嘗試過的任何內容都只是一個猜測。 –

+0

我想我會就此開始第二個主題。感謝您的幫助! –