[英]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.