在 List<> 购物篮中显示项目重复项 c#

Displaying item duplicates in a List<> shopping basket c#

我有一个程序允许用户购买物品并将每个物品放在一个列表中。这是购物篮。我希望程序也显示他们的收据。但是,如果用户购买了很多商品,那么仅列出他们的购物篮会使收据过长。所以我试图在列表中显示重复的项目:

static void generateReceipt(List<string> basket)
    {
        for (int i = 0; i < basket.Count(); i++)
        {
            Console.WriteLine(basket.Count(x => x == basket[i]) + "x ................ " + basket[i]);
        }

    }

然而,当我 运行 这个与,假设篮子中有 5 个重复的 'cake',输出将如下所示:

5x ............蛋糕

5x ............蛋糕

5x ............蛋糕

5x ............蛋糕

5x ............蛋糕

如何让我的函数只显示一个“5x ............蛋糕”?我错过了什么?

使用GroupBy.

foreach (var group in basket.GroupBy( x => x ) )
    Console.WriteLine( $"{group.Count()}x {group.Key}" );

此处最简单的解决方案是使用 GroupBy:

void Main()
{
    var basket = new List<string>
    {
        "Cake",
        "Cake",
        "Apples",
        "Bananas",
        "Cake",
        "Cookies",
        "Cake"
    };

    GenerateReceipt(basket);

    // Output:
    // 4x ................ Cake
    // 1x ................ Apples
    // 1x ................ Bananas
    // 1x ................ Cookies
}

static void GenerateReceipt(List<string> basket) {
    var groupedBasket = basket.GroupBy(b => b);

    foreach (var item in groupedBasket) {
        Console.WriteLine($"{item.Count()}x ................ {item.Key}");
    }
}

您需要找到不同的项目并计算每个项目的重复项。您可以使用 "group by" 运算符来查找它们。例如:

 static void generateReceipt(List<string> basket)
        {
            var itemsGroupped = from item in basket
                                  group item by item into g
            select new { Name = g.Key, Count = g.Count() };

            foreach (var item in itemsGroupped)
            {
                Console.WriteLine(item.Count + "x ................ " + item.Name);
            }

        }

您可以使用Distinct()

 static void generateReceipt(List<string> basket)
 {
        foreach(var item in basket.Distinct())
        {
          Console.WriteLine(basket.Count(x => x == item) + "x ................ " + item);
        }
 }