2017-03-25 10 views
2

사용자가 항목을 구입할 수있는 프로그램이있어서 각 항목을 목록에 배치합니다. 이것은 쇼핑 바구니입니다. 나는 또한 그들의 영수증을 표시하는 프로그램을 원한다. 그러나 사용자가 많은 품목을 구입하면 바구니를 나열하면 영수증이 너무 길어집니다. 그래서 목록에서 중복 항목을 표시하려고 :목록 <> 장바구니에 항목 중복 표시 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 중복 '케이크'출력 모양을 가정 해 봅시다 :

5 배 ... .......... 케이크

5 배 ............. 케이크

5 배 ............. 케이크

5x ............. 케이크

5x ............. cake

어떻게하면 "5x .......... cake"를 하나만 표시 할 수 있습니까? 내가 뭘 놓치고 있니?

+0

을 사용할 수 있도록 할 수있는 방법이 출력 단지 1 개 라인이 할 수있는? – Evk

+0

@Evk하지만 바구니에 여러 항목이있을 수 있습니다. 이 방법이 반복되지 않도록 확인하는 방법은 무엇입니까? – user3124306

+0

제공된 답변을 참조하십시오 ('GroupBy' 사용). – Evk

답변

1

당신은 당신은 당신의 루프 5 회 (basket.Count() 회)를 실행 Distinct()

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

작동하지만 'GroupBy'(O (N^2) vs. O (N))보다 상당히 느립니다.)) – Haukinger

1

GroupBy을 사용하십시오.

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

여기에 가장 쉬운 해결책은 GroupBy을 사용하는 것입니다 : 당신은 별개의 항목을 찾기 위해 각 항목에 대한 dublicated 카운트 필요

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}"); 
    } 
} 
+0

그래, GroupBy가 실제로하는 일을 찾아 봐야 할 것 같아서 ... – user3124306

+1

본질적으로 컬렉션의 고유 한 (중복되지 않은) 요소를 제공하고, 그 다음에 'Count'를 사용하여 번호를 부여 할 수있다. 그 요소가 존재했던 시간의. https://msdn.microsoft.com/en-us/library/bb534304(v=vs.110).aspx – Connor

1

. "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); 
      } 

     }