Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 04.09.2014
Сообщений: 27
1

Поиск в приложении по краткому и полному описанию

01.08.2015, 02:49. Показов 2388. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте
Пишу программу для себя, кое что не могу разобрать, вот краткое описание того, что надо реализовать:
1. Пользователь может ввести краткое описание и полное текста, после этого оно сохраняется.
2. Есть строка поиск, в которой он вводит краткое описание и получает полную информацию, или же поиск по похожем словам в полном описании или кратком, на большее совпадение по %.
Так вот:
1.1 Можно ли реализовать 1 пункт без базы данных и как, допустим если сохранять все в файлы, то это сколько программа файлов тогда на создает?
1.2 Как реализовать поиск во 2 пункте, где об этом можно почитать или посмотреть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2015, 02:49
Ответы с готовыми решениями:

как сделать вступительный текст в модуле новостей ссылкой,которая ведёт к полному описанию новости?
Доброго времени суток! Такой вопрос,как сделать вступительный текст в модуле новостей...

Поиск в таблице по полному наименованию и его части
Поиск в таблице: 1) наименование города по коду 2) код города по полному наименованию 3) код...

Поиск компьютерной игры 2000-2005 годов по описанию
Игры жанра стратегия в которой 3 расы люди орки(орда) и темные(пауки) названия точно не помню....

По краткому названию команды и фамилиям ее участников, построить полное название команды
Всем привет) Я тут решил полазить по http://********, что бы немножко потренероваться, и наткнулся...

11
23 / 23 / 11
Регистрация: 04.12.2014
Сообщений: 422
01.08.2015, 05:54 2
Невозможно без базы базы данных отображать сохраненное, если оно не в самой программе задано.
Любая сохраненная информация требует бд, иначе это выглядит как вызывать духов.
Для поиска можно использовать
C#
1
2
3
4
5
            string data = "21312[Work]12211";
            int teg1 = data.IndexOf("[") + 1;
            int teg2 = data.IndexOf("]") - teg1;
            string edited = data.Substring(teg1, teg2);
            MessageBox.Show(edited);
Можно так же использовать библиотеки и так далее, напишите, пожалуйста, поконкретней о задаче
0
1 / 1 / 0
Регистрация: 04.09.2014
Сообщений: 27
01.08.2015, 07:39  [ТС] 3
1337trix,Все просто, есть определенная информация, которая находится в приложении, ее можно добавлять или открыть( так как информации много, в приложении есть поиск), но как мой пользователь установит это приложение тогда? как оно будет работать без бд? Это получается нужно ему еще sql server устанавливать?

Добавлено через 9 минут
Представьте например игру The Elder Scrolls V: Skyrim, там все сохранения находятся в папке и каждое место сохранения, создает новый файл, тем самым можно вернуться в любой момент игры. Вот я что то типо такого хочу, без бд, допустим так:
Как вы храните нужную информацию на компьютере, в бд? Конечно же нет, а в текстовых документах, но представьте что их сотки, и нужно удобное приложение, чтоб их открывать, искать между них нужный файл, изменить его и открыть, вот и все
0
23 / 23 / 11
Регистрация: 04.12.2014
Сообщений: 422
01.08.2015, 07:42 4
Twestet, кхе-кхе...все просто
под базой данных подразумевается место и содержимое(информация)
бд может быть как локальной(папка\файл с данными), так и удаленной(на сервере MySql и тд)
Разберитесь, если Ваши данные лежат где-то на сетевом облаке, то нужно
Цитата Сообщение от Twestet Посмотреть сообщение
Это получается нужно ему еще sql server устанавливать?
если же информация лежит на компе, предположим, что с самой прогой качается и бд, то нет необходимости создавать сервер бд
0
1 / 1 / 0
Регистрация: 04.09.2014
Сообщений: 27
01.08.2015, 07:46  [ТС] 5
1337trix, а теперь по подробней, помогите с этим механизмом, хоть набросками и ссылка более подробно почитать, а то я что то загонять начал))
Данные будут лежать в папке у пользователя, не на сервере
0
23 / 23 / 11
Регистрация: 04.12.2014
Сообщений: 422
01.08.2015, 07:51 6
Twestet, все не так трудно, вот простейший пример(данные лежат в keys.txt(к примеру у меня))
C#
1
2
string data = File.ReadAllText("keys.txt");
            MessageBox.Show(data);
так мы получаем эти данные, так же можно их шифровать, если надо, читать байты и тд
ps не забудьте
C#
1
using System.IO;
0
Эксперт .NETАвтор FAQ
10413 / 5143 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.08.2015, 09:43 7
Twestet, Какой объем данных предполагаете хранить?
0
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
01.08.2015, 11:04 8
Лучший ответ Сообщение было отмечено Twestet как решение

Решение

Используй словарь. Краткое описание\полное описание. Вот примерные обработчики.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Dictionary<string, string> dict = new Dictionary<string, string>(); //словарь, Key - будет краткое описание и Value - полное
 
private void Add_Button_Click(object sender, EventArgs e)
{
 
dict.Add(textBox1.Text, textBox2.Text); //краткое описание\полное описание
 
}
private void Find_Button_Click(object sender, EventArgs e)
{
 
listBox1.Items.Clear();
 
List<string> Keys = new List<string>();
 
foreach (var entry in dict) if (entry.Key.ToLower().Contains(textToFindTextBox.Text.ToLower())) Keys.Add(entry.Key);   //выведет все краткие описания в listbox в которых содержится строка поиска, без учета регистра
 
listBox1.Items.AddRange(Keys.ToArray());
 
}
 
 
 
private void Load_Button_Click(object sender, EventArgs e)
{
 
dict = File.ReadLines("myfile.txt").Select(line => line.Split(';')).ToDictionary(line => line[0], line => line[1]); //прочитает словарь из файла - разделитель описаний ";" разделитель записей словаря - перевод строки
 
 
}
 
 
 
private void Save_Button_Click(object sender, EventArgs e)
{
 
using (var file = File.OpenWrite("myfile.txt"))
foreach (var entry in dict)
file.WriteLine("[{0};{1}]", entry.Key, entry.Value); //запишет словарь в файл - разделитель описаний ";" разделитель записей словаря - перевод строки
 
}
0
1 / 1 / 0
Регистрация: 04.09.2014
Сообщений: 27
01.08.2015, 12:12  [ТС] 9
Storm23, примерно 50мб, то есть все данные, как краткое описание, так и длинное, сохраняется в один файл?
0
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
01.08.2015, 13:25 10
С сохранением я правда косякнул насчет file.WriteLine , можно так проверить работоспособность:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dictionary<string, string> dict = new Dictionary<string, string>();
 
            dict.Add("short1", "long1");
            dict.Add("short2", "long2");
            dict.Add("short3", "long3");
 
            List<string> linestosave = new List<string>();
 
            
            foreach (var entry in dict) linestosave.Add(entry.Key+";"+entry.Value);
            
            File.WriteAllLines("file.csv", linestosave, Encoding.GetEncoding(1251));
 
            dict = File.ReadLines("file.csv").Select(line => line.Split(';')).ToDictionary(line => line[0], line => line[1]);
 
            MessageBox.Show(dict["short1"] + Environment.NewLine +
                                      dict["short2"] + Environment.NewLine +
                                      dict["short3"]);
0
Эксперт .NETАвтор FAQ
10413 / 5143 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.08.2015, 14:41 11
Лучший ответ Сообщение было отмечено Twestet как решение

Решение

Twestet,
Модель данных и бизнес логика

Бинарная сериализация, сжатие GZIP.
Нечеткий поиск.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
    /// <summary>
    /// Список записей
    /// </summary>
    [Serializable]
    public class Records : List<Record>
    {
        public static Records Instance = new Records();
    }
 
    /// <summary>
    /// Запись
    /// </summary>
    [Serializable]
    public class Record
    {
        public string ShortDescription { get; set; }
        public string FullDescription { get; set; }
    }
 
    /// <summary>
    /// Чтение, запись в файл (сжатие gzip)
    /// </summary>
    public class RecordsManager
    {
        public void Load(string fileName)
        {
            using (var stream = File.OpenRead(fileName))
            using (var zip = new GZipStream(stream, CompressionMode.Decompress))
                Records.Instance = (Records)new BinaryFormatter().Deserialize(zip);
        }
 
        public void Save(string fileName)
        {
            using (var stream = File.OpenWrite(fileName))
            using (var zip = new GZipStream(stream, CompressionMode.Compress))
                new BinaryFormatter().Serialize(zip, Records.Instance);
        }
 
        public void New()
        {
            Records.Instance = new Records();
        }
    }
 
    /// <summary>
    /// Поиск записей
    /// </summary>
    public class Finder
    {
        public IEnumerable<Record> FindLike(string shortDescKeyword)
        {
            return Records.Instance.OrderByDescending(r => Like(shortDescKeyword, r.ShortDescription)).Take(10);
        }
 
        static float Like(string str1, string str2)
        {
            int l = str2.Length;
            int l1 = str1.Length;
            if (l1 > l)
            {
                string s = str1;
                str1 = str2;
                str2 = s;
                l = l1;
            }
 
            if (l > 0)
            {
                str1 = str1.ToUpper();
                str2 = str2.ToUpper();
                int count = 0;
                for (int i = 0; i < l - 1; i++)
                {
                    string s = str2.Substring(i, 2);
                    if (str1.IndexOf(s) < 0)
                        count++;
                }
                return 1f - (float)count / l;
            }
            else
                return 0f;
        }
    }

Главная форма

Динамическая генерация диалоговых панелей.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
    public partial class MainForm : Form
    {
        private Control currentControl = null;
 
        public MainForm()
        {
            InitializeComponent();
        }
 
        private void miNew_Click(object sender, EventArgs e)
        {
            new RecordsManager().New();
        }
 
        private void miOpen_Click(object sender, EventArgs e)
        {
            var ofd = new OpenFileDialog() {Filter = "Binary database|*.bin"};
            if(ofd.ShowDialog() == DialogResult.OK)
                new RecordsManager().Load(ofd.FileName);
        }
 
        private void miSave_Click(object sender, EventArgs e)
        {
            var sfd = new SaveFileDialog() { Filter = "Binary database|*.bin" };
            if (sfd.ShowDialog() == DialogResult.OK)
                new RecordsManager().Save(sfd.FileName);
        }
 
        private void miAdd_Click(object sender, EventArgs e)
        {
            Controls.Remove(currentControl);//удаляем предыдущий диалог
            //создаем диалог
            currentControl = new AddRecordPanel() {Parent = this, Dock = DockStyle.Fill};
            currentControl.BringToFront();
        }
 
        private void miFind_Click(object sender, EventArgs e)
        {
            Controls.Remove(currentControl);//удаляем предыдущий диалог
            //создаем диалог
            currentControl = new FindPanel() { Parent = this, Dock = DockStyle.Fill };
            currentControl.BringToFront();
        }
 
        private void miExit_Click(object sender, EventArgs e)
        {
            Close();
        }
    }

Глобальный обработчик исключений

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public static class ExceptionHandler
    {
        public static void Init()
        {
            Application.ThreadException -= Handle;
            Application.ThreadException += Handle;
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException, true);
        }
 
        static void Handle(object sender, ThreadExceptionEventArgs e)
        {
            var ex = e.Exception;
            while (ex.InnerException != null)
                ex = ex.InnerException;
 
#if DEBUG
            using (var exceptionDlg = new ThreadExceptionDialog(ex))
            {
                var res = exceptionDlg.ShowDialog();
                if (res == DialogResult.Abort)
                    Application.Exit();
            }
#else
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
#endif
        }
    }

Панель поиска

Виртуальный режим DataGridView.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    public partial class FindPanel : UserControl
    {
        private List<Record> results = new List<Record>();
 
        public FindPanel()
        {
            InitializeComponent();
        }
 
        private void tbShort_TextChanged(object sender, EventArgs e)
        {
            results = new Finder().FindLike(tbShort.Text).ToList();
            Update();
        }
 
        new void Update()
        {
            dgvResults.RowCount = results.Count;
            dgvResults.Invalidate();
        }
 
        private void dgvResults_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
        {
            if (e.RowIndex >= results.Count || e.RowIndex < 0)
                return;
 
            switch(e.ColumnIndex)
            {
                case 0: e.Value = results[e.RowIndex].ShortDescription; break;
                case 1: e.Value = results[e.RowIndex].FullDescription; break;
            }
        }
    }

Панель добавления записей

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public partial class AddRecordPanel : UserControl
    {
        public AddRecordPanel()
        {
            InitializeComponent();
        }
 
        private void btAdd_Click(object sender, EventArgs e)
        {
            var rec = new Record {FullDescription = tbFull.Text, ShortDescription = tbShort.Text};
            Records.Instance.Add(rec);
            tbFull.Text = null;
            tbShort.Text = null;
        }
    }


Исходник: WindowsFormsApplication304.zip

Поиск в приложении по краткому и полному описанию
0
1 / 1 / 0
Регистрация: 04.09.2014
Сообщений: 27
02.08.2015, 01:50  [ТС] 12
Storm23, спасибо большое
0
02.08.2015, 01:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2015, 01:50
Помогаю со студенческими работами здесь

Небольшой поиск в приложении
Здравствуйте всем) Задумал как-то сделать небольшое приложение, поиск погоды, просто так.Так от...

Поиск кнопок в другом приложении
Помогите) Пользователь выбирает приложение,в этом приложении нужно найти все кнопки и по очереди...

Как сделать поиск в веб-приложении?
Всем привет! Практикуюсь в разработке веб-приложения, где нужно осуществить сортировку по номеру и...

Поиск и замена в запущенном приложении определенного текста
Ребят! Помогите дописать код. Программа должна искать в запущенном приложении определенный текст и...

Java полному новичку
Решил 100% и уже точно .что хочу стать программистом.Раньше была куча сомнений, постоянно смотрел в...

Qt загрузка картинки по полному пути
Здравствуйте уважаемые форумчане возникла ни откуда такая проблема, гружу картинку по полному...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru