Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2016, 13:10   #11
Дима85
Пользователь
 
Регистрация: 11.06.2016
Сообщений: 20
По умолчанию

Спасибо, просто не обратил внимания на 6 пост. Проверил, вроде работает. Последний вопрос. А как подсчитать количество повторений и вывести в консоль? В моём примере это было так
Код:
//получать и устанавливать подсчет одинаковых фрагментов
            var c = 0;
            count.TryGetValue(f, out c);
            count[f] = c + 1;
        }
        //найти максимальное количество
        var best = count.OrderByDescending(p => p.Value).First();

        //чаще всего
        Console.WriteLine("Тройка чисел: {0} Повторений: {1}", best.Key, best.Value);
best.Value это количество повторений.
Если не ответите, всё равно спасибо, что помогли разобраться с основной частью кода.
Дима85 вне форума Ответить с цитированием
Старый 11.06.2016, 13:15   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
            var first = sorted.First();
            Console.WriteLine("Тройка чисел: {0} Повторений: {1}", first.Key, first.Count);
в принципе sorted это коллекция отсортированнных по повторениям комбинаций.
где
Key это строковое представление тройки
Fragment это данные тройки(отсортированный по возрастанию)
Count - количество повторений тройки.
(на случай если понадобится вывести все или несколько)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 11.06.2016 в 13:23.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.06.2016, 13:15   #13
Дима85
Пользователь
 
Регистрация: 11.06.2016
Сообщений: 20
По умолчанию

Кстати, забыл спросить, а что нужно изменить, чтобы искать, допустим, не тройки, а пары чисел или четвёрки? Ещё раз спасибо за помощь.
Дима85 вне форума Ответить с цитированием
Старый 11.06.2016, 13:19   #14
Дима85
Пользователь
 
Регистрация: 11.06.2016
Сообщений: 20
По умолчанию

Спасибо огромное за помощь.
Дима85 вне форума Ответить с цитированием
Старый 11.06.2016, 13:46   #15
Дима85
Пользователь
 
Регистрация: 11.06.2016
Сообщений: 20
По умолчанию

Сам разобрался что нужно изменить. )
Дима85 вне форума Ответить с цитированием
Старый 11.06.2016, 13:47   #16
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну и держите тогда полностью настраиваемую
Код:
using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static IEnumerable<int[]> GenerateCombinations(int combinationLength, int[] source)
        {
            //Contract.Requires<ArgumentException>(combinationLength > 0, "Длина комбинации должна быть больше нуля");
            if (source.Length < combinationLength)
                yield break;
            if(combinationLength==1)
            {
                yield return source;
                yield break;
            }
            int index = 0;
            int maxIndex = combinationLength - 1;
            int[] indexes = new int[combinationLength];
            indexes[0] = 0;
            var cache = new List<int[]>();
            while (index >= 0)
            {
                if (indexes[index] >= source.Length - index)
                {
                    index--;
                    if (index >= 0)
                        indexes[index]++;
                }
                else if (index < maxIndex)
                {
                    index++;
                    indexes[index] = 0;
                }
                else
                {
                    var res = new int[combinationLength];
                    for (int i = 0; i < res.Length; i++)
                    {
                        res[i] = source[indexes[i] + i];
                    }
                    res = res.Distinct().OrderBy(a => a).ToArray();
                    if (res.Length == combinationLength && !cache.Any(c => Enumerable.SequenceEqual(c, res)))
                    {
                        cache.Add(res);
                        yield return res;
                    }
                    indexes[index]++;
                }
            }
        }
        static void Main(string[] args)
        {
            var arrays = new List<int[]>();
            arrays.Add(new int[] { 1, 10, 15, 20, 41 });
            arrays.Add(new int[] { 1, 9, 15, 14, 73 });
            arrays.Add(new int[] { 2, 1, 3, 15, 41 });
            arrays.Add(new int[] { 66, 15, 41, 55, 1 });
            arrays.Add(new int[] { 56, 15, 73, 4, 11 });
            var sorted = arrays.SelectMany(a => GenerateCombinations(2, a)).
                GroupBy(f => string.Join(", ", f)).
                Select(g => new { Count = g.Count(), Key = g.Key, Fragment = g.First() }).
                OrderByDescending(g => g.Count).ToArray();
            var first = sorted.First();
            Console.WriteLine("Комбинация чисел: {0} Повторений: {1}", first.Key, first.Count);
        }
    }
}
длина передается в вызов метода GenerateCombinations.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.06.2016, 14:03   #17
Дима85
Пользователь
 
Регистрация: 11.06.2016
Сообщений: 20
По умолчанию

Спасибо большое. Не думал, что здесь так быстро смогут помочь, ещё и с развёрнутыми ответами. )
Дима85 вне форума Ответить с цитированием
Старый 12.06.2016, 11:04   #18
Дима85
Пользователь
 
Регистрация: 11.06.2016
Сообщений: 20
По умолчанию

Не получается интегрировать этот код для Windows Forms, одни ошибки. Не могу разобраться какую часть кода оставить основной, а какую добавить в обработчик события нажатия кнопки. Да и с массивами непонятно как переделать под массивы текстбоксов. Вот мой код для WinForms, там есть много лишнего (точнее моего), не обращайте внимания:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PoiskComb
{
    public partial class Form1 : Form
    {
        CheckBox[] chb; // Массив чекбоксов
        TextBox[] tb; // Массив текстбоксов
        public Form1()
        {
            InitializeComponent();
            // Связывание по тэгам
            textBox1.Tag = checkBox1; 
            textBox2.Tag = checkBox2;
            textBox3.Tag = checkBox3;
            textBox4.Tag = checkBox4;
            textBox5.Tag = checkBox5;

            // Инициализация массивов
            chb = new CheckBox[] { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5 };
            tb = new TextBox[] { textBox1, textBox2, textBox3, textBox4, textBox5 };
        }
        // Событие для связывания чекбоксов и текстбоксов
        private void chb_CheckedChanged(object sender, EventArgs e)
        {
            tb[Array.IndexOf(chb, (sender as CheckBox))].Enabled = (sender as CheckBox).Checked;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        // Сделать все чеки включенными, боксы активными
        private void button2_Click(object sender, EventArgs e)
        {
            foreach (CheckBox chb in Controls.OfType<CheckBox>().Where(x => x.Checked == false))
            {
                chb.Checked = true;
            }
        }

        // Сделать все чеки отключенными, боксы неактивными
        private void button3_Click(object sender, EventArgs e)
        {
            foreach (CheckBox chb in Controls.OfType<CheckBox>().Where(x => x.Checked == true))
            {
                chb.Checked = false;
            }
        }

        // Сделать программу поверх остальных окон
        private void button4_Click(object sender, EventArgs e)
        {
            if (TopMost == false)
                TopMost = true;
            else
                TopMost = false;
        }

        // Закрыть или нет программу
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult dr = MessageBox.Show("Вы уверены, что хотите выйти из программы?", "Закрытие программы", MessageBoxButtons.YesNo);
            if (dr == DialogResult.Yes)
                e.Cancel = false;
            else
                e.Cancel = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }
    }
}
Мне нужно только распределить код, массивы с числами переделать под массивы с текстбоксами и понять какой код нужно вставить в событие кнопки button1_Click.
Извините за назойливость, просто с чужим код сложнее разобраться, чем со своим. ) Спасибо ещё раз.
Дима85 вне форума Ответить с цитированием
Старый 12.06.2016, 11:15   #19
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну так типы преобразуйте...
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PoiskComb
{
    public partial class Form1 : Form
    {
        CheckBox[] chb; // Массив чекбоксов
        TextBox[] tb; // Массив текстбоксов
        public Form1()
        {
            InitializeComponent();
            // Связывание по тэгам
            textBox1.Tag = checkBox1; 
            textBox2.Tag = checkBox2;
            textBox3.Tag = checkBox3;
            textBox4.Tag = checkBox4;
            textBox5.Tag = checkBox5;

            // Инициализация массивов
            chb = new CheckBox[] { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5 };
            tb = new TextBox[] { textBox1, textBox2, textBox3, textBox4, textBox5 };
        }
        // Событие для связывания чекбоксов и текстбоксов
        private void chb_CheckedChanged(object sender, EventArgs e)
        {
            tb[Array.IndexOf(chb, (sender as CheckBox))].Enabled = (sender as CheckBox).Checked;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        // Сделать все чеки включенными, боксы активными
        private void button2_Click(object sender, EventArgs e)
        {
            foreach (CheckBox chb in Controls.OfType<CheckBox>().Where(x => x.Checked == false))
            {
                chb.Checked = true;
            }
        }

        // Сделать все чеки отключенными, боксы неактивными
        private void button3_Click(object sender, EventArgs e)
        {
            foreach (CheckBox chb in Controls.OfType<CheckBox>().Where(x => x.Checked == true))
            {
                chb.Checked = false;
            }
        }

        // Сделать программу поверх остальных окон
        private void button4_Click(object sender, EventArgs e)
        {
            if (TopMost == false)
                TopMost = true;
            else
                TopMost = false;
        }

        // Закрыть или нет программу
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult dr = MessageBox.Show("Вы уверены, что хотите выйти из программы?", "Закрытие программы", MessageBoxButtons.YesNo);
            if (dr == DialogResult.Yes)
                e.Cancel = false;
            else
                e.Cancel = true;
        }
static IEnumerable<int[]> GenerateCombinations(int combinationLength, int[] source)
        {
            //Contract.Requires<ArgumentException>(combinationLength > 0, "Длина комбинации должна быть больше нуля");
            if (source.Length < combinationLength)
                yield break;
            if(combinationLength==1)
            {
                yield return source;
                yield break;
            }
            int index = 0;
            int maxIndex = combinationLength - 1;
            int[] indexes = new int[combinationLength];
            indexes[0] = 0;
            var cache = new List<int[]>();
            while (index >= 0)
            {
                if (indexes[index] >= source.Length - index)
                {
                    index--;
                    if (index >= 0)
                        indexes[index]++;
                }
                else if (index < maxIndex)
                {
                    index++;
                    indexes[index] = 0;
                }
                else
                {
                    var res = new int[combinationLength];
                    for (int i = 0; i < res.Length; i++)
                    {
                        res[i] = source[indexes[i] + i];
                    }
                    res = res.Distinct().OrderBy(a => a).ToArray();
                    if (res.Length == combinationLength && !cache.Any(c => Enumerable.SequenceEqual(c, res)))
                    {
                        cache.Add(res);
                        yield return res;
                    }
                    indexes[index]++;
                }
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
             tb.Where(t=>t.Enabled).Select(t=>{
   var arr=t.Split(' ');
   var res=new List<int>();
   foreach(var val in arr)
   {
       int i;
       if(int.TryParse(val, out i))
          res.Add(i);
   }
   return res.ToArray();
}).SelectMany(a => GenerateCombinations(2, a)).
                GroupBy(f => string.Join(", ", f)).
                Select(g => new { Count = g.Count(), Key = g.Key, Fragment = g.First() }).
                OrderByDescending(g => g.Count).ToArray();
            var first = sorted.First();
           //сами выведите куда надо. first та самая комбинация
        }
    }
}
писал код прям тут, но поидее должен работать(тексбоксы учитывает только активные)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.06.2016, 11:16   #20
Дима85
Пользователь
 
Регистрация: 11.06.2016
Сообщений: 20
По умолчанию

Кстати, хотелось бы ещё выделить отдельно код для изменения длины комбинаций, я хочу связать его с другими чекбоксами, допустим включив на форме один чекбокс, поиск вёлся по тройкам, выбрав другой, то по четвёркам.

Хорошо, спасибо. Самому пришлось бы долго разбираться. В си шарпе я ещё пока новичок. )

Последний раз редактировалось Пепел Феникса; 12.06.2016 в 11:21.
Дима85 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод случайных не повторяющихся чисел в Stringgrid Heng Помощь студентам 12 07.10.2012 16:59
Поиск повторяющихся символов RNR Общие вопросы Delphi 1 25.06.2012 02:43
Определение количества повторяющихся чисел в строке Tidus Microsoft Office Excel 11 13.12.2010 23:36
поиск повторяющихся элементов в матрице I_newbie Помощь студентам 2 15.03.2010 22:44
Поиск повторяющихся значений Flangini Microsoft Office Excel 23 22.02.2008 15:57