簡體   English   中英

排序和分組

[英]Sorting and grouping

我正在處理飯店POS(Samba pos)的源代碼,在打印票證時如何格式化輸出有2個問題。

下面的代碼收集產品標簽,制作產品標頭,並在標頭下方對產品進行排序。

問題1:我對標題的順序沒有任何影響,因此輸出如下所示:

主菜

牛排22,50

飲料

可樂2,00

初學者

湯3,50

正確的順序應該是開胃菜->主菜->甜點->飲料如果我可以按字母順序對標題進行排序,將對您有很大幫助。 我將組標記更改為:1個入門,2個主菜等

問題2:

產品在程序的較早階段進行分組。 由於程序員的選擇,分組對我來說效果不佳。 我在票上有很長的清單,例如:

1 x可樂2,00

2 x可樂4,00

有沒有一種方法可以在這里對產品進行分組,以便我可以:

3 x可樂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;
}

我必須對var groups進行排序。 問題在於循環中的文本{PRODUCT TAG}被替換為grp.Key ,因此在循環之前對var groups進行排序可能無法工作(我是否需要一個額外的循環?)。

在循環的第3行上將產品添加到標題中。 是否可以在此處對項目進行分組?

我已將整個文件轉儲到此處: http : //pastebin.com/qFr5wN28

編輯:

這段代碼用於在票務打印機上產生票證。 一張票看起來像這樣:

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

標頭是我可以添加到產品中的標簽。 有幾處錯誤:文章上方的標題(沙漠,主要課程)隨機出現。 我想對它們進行排序。 並非所有文章都被分組,例如“吐司和果醬”。 如果可以對標題進行排序,則可以稍微更改標簽。 所需的輸出將是這樣的:

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

您可以使用OrderBy來訂購行,如下所示:

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

您還可以遍歷各個組並修改密鑰的值。 這可以通過將“ 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));

輸出:

Dinner steak 1
Dinner chicken 2
Desert chocolate 1

顯然,您將需要修改數據類型等,但是查詢本身應該為您提供所需的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM