Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分类和分组_C#_Sorting_Grouping - Fatal编程技术网

C# 分类和分组

C# 分类和分组,c#,sorting,grouping,C#,Sorting,Grouping,我正在编写一个餐馆POS Samba POS的源代码,在打印票证时,我有两个问题:如何格式化输出 下面的代码收集产品的标签,制作标题,并对标题下的产品进行排序 问题1:我对标题的顺序没有影响,因此输出如下: 主菜 牛排22,50 饮料 可乐2,00 起动器 汤3,50 正确的顺序应该是开胃菜->主菜->甜点->饮料 如果我能按字母顺序对标题进行排序,我会得到很大帮助。我会将小组标签改为:1名初学者,2名主菜等 问题2: 产品在项目的早期阶段进行分组。由于程序员的选择,分组对我来说不太合适。我在票

我正在编写一个餐馆POS Samba POS的源代码,在打印票证时,我有两个问题:如何格式化输出

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

问题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;
}
标题是我可以添加到产品中的标记。 有几件事是错误的:标题上面的文章沙漠,主菜出现随机。我想把它们分类。并不是所有的物品都分组,例如吐司和果酱。如果我能对标题进行排序,我会稍微更改标记。所需的输出如下所示:

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

您可以使用like so订购您的产品线:

您还可以在组中循环并修改密钥的值。这可以通过向组中添加选择投影来实现

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

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

我不完全清楚您的问题是什么,但您可以在创建组以创建新投影时添加Select,如果grp.Key是一个问题,最大的问题是我没有C经验:-票上出现的组的顺序是随机的。这很令人困惑。我必须找到一种方法对组进行排序,打印在票据上的组以逻辑方式显示,如:1。先发球员2。主要课程3。您可以使用OrderBy轻松地对组进行排序。为了给你更多的帮助,如果你能用一个非常小的数据样本来编辑你的问题,这将是非常有用的,它清楚地显示了你想要什么,以及你上面的代码目前正在做什么。我已经添加了一个票证和一个想要的票证。自动格式化程序让我很为难:-我假设您的标题是您对lines.GroupByGetMenuItemTag;调用的键;。要订购这些产品,只需调用lines.GroupByGetMenuItemTag.OrderByl=>l.Key。首先,我想说我非常感谢您的帮助!我会尽量多解释一下我的问题。通过你给我的代码,我能够影响组标题的顺序。一个组现在包含一个标题和属于该标题的产品:软饮料->可乐->芬达我想归档的是添加重复的产品。因此,软饮料->1 x可乐1,50->1 x可乐1,50变为软饮料->2 x可乐3,00我相信您现在需要第二个GroupBy来计算这些值,这样您就可以对它们进行聚合并获得计数。不幸的是,我在这台机器上没有VS,所以我尝试的任何东西都有点猜测。我想我将开始第二个话题。谢谢你的帮助@het.oosten我编辑了我的答案,以提供更多信息,并希望回答您的全部问题。谢谢,这非常有帮助。我会看看是否能找出var组包含哪些项目,然后从那里继续。
//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