@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;
                }
            }

Надеюсь достаточно описал, если надо, могу полностью код скинуть и само задание с которым возникла трудность.
  • Вопрос задан
  • 201 просмотр
Пригласить эксперта
Ответы на вопрос 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() + ")");
	}
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
PHYGITALISM Москва
от 80 000 до 130 000 ₽
от 130 000 до 200 000 ₽
BP Mobile Москва
от 170 000 ₽
26 мая 2020, в 05:17
1500 руб./в час
26 мая 2020, в 02:01
4500 руб./за проект
26 мая 2020, в 00:42
10000 руб./за проект