我有一个允许用户购买商品的程序,它将每个商品放在一个列表中。这是购物篮。我希望程序也显示他们的收据。但是,如果用户购买了大量物品,那么仅仅列出他们的购物篮就会使收据过长。所以我试着在列表中显示重复的项目:
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个重复的蛋糕&#39;在篮子中,输出将如下所示:
5x .............蛋糕
5x .............蛋糕
5x .............蛋糕
5x .............蛋糕
5x .............蛋糕
我如何让我的功能只显示一个&#34; 5x ..........蛋糕&#34;?我错过了什么?
答案 0 :(得分:1)
使用GroupBy
。
foreach (var group in basket.GroupBy( x => x ) )
Console.WriteLine( $"{group.Count()}x {group.Key}" );
答案 1 :(得分:1)
此处最简单的解决方案是使用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}");
}
}
答案 2 :(得分:1)
您需要为每个项目找到不同的项目和计数。您可以使用&#34; group by&#34;寻找他们的运营商。例如:
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);
}
}
答案 3 :(得分:1)
您可以使用Distinct()
static void generateReceipt(List<string> basket)
{
foreach(var item in basket.Distinct())
{
Console.WriteLine(basket.Count(x => x == item) + "x ................ " + item);
}
}