0

我正在研究餐厅 POS (Samba pos) 的源代码,并且在打印票时如何格式化输出有 2 个问题。

下面的代码收集产品的标签,制作它们的标题,并对标题下的产品进行排序。

问题1:我对标题的顺序没有影响,所以输出看起来像:

主菜

牛排 22,50

饮料

可乐 2,00

开胃菜

汤 3,50

正确的顺序应该是 Starters --> Main course --> Desserts --> Drinks 如果我可以按字母顺序对标题进行排序,我会得到很大帮助。我会将组标签更改为:1 Starters、2 Maincourse 等

问题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
4

1 回答 1

1

您可以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

显然,您将需要修改数据类型等,但查询本身应该为您提供所需的内容。

于 2013-02-02T18:53:13.667 回答