0

私はレストラン POS (Samba pos) のソース コードに取り組んでおり、チケットを印刷するときに出力がどのようにフォーマットされるかについて 2 つの問題があります。

以下のコードは、製品のタグを収集し、それらのヘッダーを作成し、ヘッダーの下に製品を並べ替えます。

問題 1: ヘッダーの順序に影響がないため、出力は次のようになります。

メインコース

ステーキ 22,50

飲み物

コーラ 2,00

スターター

スープ 3,50

正しい順序は、スターター --> メイン コース --> デザート --> ドリンク です。ヘッダーをアルファベット順に並べ替えることができれば、非常に助かります。グループタグを次のように変更します:1スターター、2メインコースなど

問題 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;
}

ソートする必要がありますvar groupsgrp.Key問題は、テキスト {PRODUCT TAG} がループ内で置き換えられることです。そのため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 に答える