2016-09-27 10 views
1

私は既に配列中で最も頻繁に番号が1つ見つかって何回繰り返されるかを見つける方法を作成しました。しかし、私の仕事は、それらが同じ時間量だけ繰り返されている場合、少数の数字を見つけることです。別の方法を作成すべきか、あるいはどのようにして解決策を見つけることができますか?配列内で最も頻繁に使用される要素を見つけよう

public static void most(Ring[] rings, int numCounter, out int popHallmark, out int amount) 
    { 
     amount = 1; 
     popHallmark = 0; 
     for (int i = 0; i < numCounter; i++) 
     { 
      int count = 0; 
      int temp = rings[i].HallMark; 
      count++; 
      for (int k = 0; k < numCounter; k++) 
      { 
       if (i != k) 
       { 
        if (k > i) 
        { 
         if (temp == rings[k].HallMark) 
         { 
          count++; 
          if (count > amount) 
          { 
           popHallmark = temp; // most popular hallmark 
           amount = count; //amount of rings that has this hallmark 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
+3

がグループ化されたデータは、周波数順を取得するには、 '' 'rings.Takeを行うのに十分です(numCounter).GroupBy(x => x.HallMark).OrderByDescending(x => x.Count()) '' ' – tym32167

答えて

3

linqメソッドGroupBy()を使用できます。 は、あなたがこのような何かを行うことができるよりも、あなたはintの配列を持っているとします

var groupedNumbers = yourArray.GroupBy(x=>x) 

これは、すべてのグループが同じ数字が含まれることを意味します。 次に、すべてのグループに対してCount()メソッドを呼び出して、グループに含まれる要素の数を取得する必要があります。

var numberCount = groupedNumberes.Select(x=>new{ 
    number = x.Key, 
    numberOfOccurrences = x.Count 
}) 

numberCountには、番号と繰り返し回数を含むアノニマスオブジェクトのコレクションが含まれます。 これがあなたを助けてくれることを願っています。

編集:numberCountを注文すると、あなたが必要とする「FEW」の数値を得ることができますより あなたを:

numberCount.OrderByDescending(x=>x.numberOfOccurrences).Take(howManyNumbersYouNeed).Select(x=>x.number) 
関連する問題