@DeadDeveloper

Перебор массива на совпадения!?

В общих деталях, у меня есть массив на 5 элементов. (но в дальнейшем количество элементов может быть увеличено, так что можно считать что массив не ограничен). И мне нужно прочесать массив на совпадение и указать если есть совпадения то сколько их для каждого РАЗНОГО элемента массива. То есть, (смотреть ниже в коде), 3 совпадения в первом случае, 3 совпадения во втором, при этом 2 совпадения для единиц и 1 совпадение для двоек и 1 совпадение в третьем случае. Мне я так понял нужен алгоритм наподобие:
public int[] ScoreCombo;
    private void Start()
    {
        ScoreCombo = new int[5]{1, 2, 1, 1, 1};//Первый случай
    }
//Или к примеру {1, 1, 2, 2, 1} Второй случай
//Или {4, 2, 1, 5, 1} И третий случай
//И любые другие вариации
            int BufferMas = 0;
            for (int a = 1; a < ScoreCombo.Length; a++)
            {
                if(ScoreCombo[BufferMas] == ScoreCombo[a])//Тут я проверяю соответствия в массиве
                {
                    Debug.Log("Совпадение: " + "Element " + BufferMas + ", Element " + a);
                }
                if (a == 4 && ScoreCombo[BufferMas] != ScoreCombo[BufferMas + 1])//А здесь я проверяю, 
//Стоит ли делать второй проход со следующем индексом массива для поиска соответствий.
//Тут как по мне и кроется загвоздка в решении моей проблемы.
                {
                    BufferMas++;
                    a = BufferMas;
                }
            }

Надеюсь достаточно описал, если надо, могу полностью код скинуть и само задание с которым возникла трудность.
  • Вопрос задан
  • 944 просмотра
Пригласить эксперта
Ответы на вопрос 2
Если я правильно понял вопрос, то через словарь это делается вот так:
using System;
using System.Collections.Generic;

namespace GetRepetitions
{
    class Program
    {
        static void Main(string[] args)
        {
            var scoreCombo = new int[] { 1, 2, 1, 1, 1 };
            var repetitions = GetRepetitionsCount(scoreCombo);   
            
            foreach (var kv in repetitions)           
                Console.WriteLine($"Num: {kv.Key}, Rep. Count: {kv.Value}");            
        }

        static Dictionary<int, int> GetRepetitionsCount(int[] arr)
        {
            var repetitions = new Dictionary<int, int>();
            foreach (var num in arr)
                if (repetitions.ContainsKey(num))
                    repetitions[num]++;
                else
                    repetitions.Add(num, 0);
            return repetitions;
        }
    }
}
Ответ написан
Комментировать
С помощью LINQ можно сгруппировать элементы массива по их значению и отобрать те, количество которых больше 1.

using System;
using System.Linq;

public class Test
{
	public static void Main()
	{
        int[] ScoreCombo = new int[5] { 1, 2, 1, 1, 1 };
        foreach(var repeat in ScoreCombo.GroupBy(i => i).Where(g => g.Count() > 1))
            Console.WriteLine("Repeat: " + repeat.Key + " (" + repeat.Count() + ")");
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы