С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/40: Рейтинг темы: голосов - 40, средняя оценка - 4.90
2 / 2 / 0
Регистрация: 22.12.2017
Сообщений: 115
1

Нечеткий поиск

24.12.2018, 14:18. Показов 7308. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, мне нужно сделать нечеткий поиск(по левенштейну). Типа вводим в текстбоксе слово(фамилию например) и сравниваем с таблицей. Нужно чтобы допустим ввел слово и показывалось сообщение(пропущена буква, есть лишняя буква, заменена буква, совпадение есть).
Вот наработки кода:
XML
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
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid ShowGridLines="False" Background="Aqua">
        <Grid.RowDefinitions>
 
            <RowDefinition Height="71.2"/>
            <RowDefinition Height="268"/>
            <RowDefinition Height="64.8"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Button x:Name="button1" Content="Поиск"  VerticalAlignment="Bottom" Margin="10"  Grid.Row="0" Grid.Column="1" Click="Button1_Click"/>
        <TextBox x:Name="text1" Height="23" TextWrapping="Wrap" Text="" VerticalAlignment="Bottom" Margin="10" Grid.Row="0" Grid.Column="0"/>
        <DataGrid x:Name="list" VerticalAlignment="Bottom" Margin="10,0,10,10" Grid.Row="1" Grid.Column="0" Height="249" Grid.ColumnSpan="3"/>
        <Button x:Name="button2" Content="Очистить"  VerticalAlignment="Bottom" Margin="10" Grid.Row="0" Grid.Column="2" Click="Button2_Click"/>
        <Button x:Name="button3" Content="добавить"  VerticalAlignment="Bottom" Margin="0,0,20,0" Grid.Row="2" Grid.Column="1" Click="Button3_Click"/>
        <TextBox x:Name="text2" Height="23" TextWrapping="Wrap" Text="" VerticalAlignment="Bottom" Margin="10" Grid.Row="2" Grid.Column="0"/>
 
    </Grid>
</Window>
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data.SqlClient;
using System.Data;
 
namespace WpfApp1
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        static string s;
        public MainWindow()
        {
            InitializeComponent();
 
            string connect = @"Data Source=WS;Initial Catalog=Клиент;Persist Security Info=True;User ID=sa;Password=12345";
            SqlConnection conn = new SqlConnection(connect);
            conn.Open();
           // SqlCommand myCommand = conn.CreateCommand();
            string myCommand = "Select * from Клиент";
           using(SqlCommand command=new SqlCommand(myCommand, conn))
            {
                DataTable dataTable = new DataTable();
                SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                list.ItemsSource = dataTable.DefaultView;
                list.Items.Refresh();
            }
            conn.Close();
 
        }
 
         
         
 
 
        private void Button1_Click(object sender, RoutedEventArgs e)
        {
            //  string sql = "insert into Клиент(Фамилия, Имя, Отчество, Номер_телефона, Эл_почта) values(@Фамилия, @Имя, @Отчество, @Номер_телефона, @Эл_почта)";
            //  string sql = "select * from Клиент where Фамилия=@Фамилия";
            //  string connect = @"Data Source=WS;Initial Catalog=Клиент;Persist Security Info=True;User ID=sa;Password=12345";
            // SqlConnection conn = new SqlConnection(connect);
            // SqlDataAdapter command = new SqlDataAdapter(sql, conn);
            //conn.Open();
            // command.SelectCommand.Parameters.AddWithValue("@Фамилия", text1.Text.Trim());
            // conn.Close();
 
            text1.Text = s;
            string z = text1.Text;
            string[] vocab = new string[1];
            // string rez = "";
            int count = 0;
            string temp1;
            string temp2 = ' ' + z;
         //  for (int i = 0; i < 1; i++)
            {
               // vocab[i] = text1.Text;
              //  list.ItemsSource(vocab[i]);
            }
            for (int i = 0; i < 1; i++)
            {
                if (z == vocab[i]) // если слова совпадают
                {
                    MessageBox.Show(" -совпадение");
                   // vocab[i] = "0";
                    // MessageBox.Show("Все верно");
                }
 
                else if (z.Length == vocab[i].Length) //если буква заменена 
                {
                    count = 0;
                    for (int j = 0; j < vocab[i].Length; j++)
                    {
                        if (vocab[i].Substring(j, 1) == String.Concat(z[j])) count++;
 
                        if (j == vocab[i].Length - 1 && count == z.Length - 1)
                        {
                           MessageBox.Show(" -заменена буква");
                           vocab[i] = "0";
                        }
                    }
                }
                //если буква пропущена 
                else if (z.Length - 1 == vocab[i].Length)
                {
                    for (int a = 0; a < z.Length; a++)
                    {
                        temp1 = z.Remove(a, 1);
                        count = 0;
                        for (int j = 0; j < vocab[i].Length; j++)
                        {
                            if (vocab[i].Substring(j, 1) == String.Concat(temp1[j])) count++;
 
                            if (j == vocab[i].Length - 1 && count == z.Length - 1)
                            {
                                MessageBox.Show( " -пропущена буква");
                                vocab[i] = "0";
                            }
                        }
                    }
                }
                else //если вставленна лишняя буква
                {
                    for (int a = 0; a < vocab[i].Length; a++)
                    {
                        count = 0;
                        for (int j = 0; j < s.Length + 1; j++)
                        {
                            if (vocab[i].Substring(j, 1) == String.Concat(temp2[j])) count++;
 
                            if (j == vocab[i].Length - 1 && count == s.Length)
                            {
                                MessageBox.Show(" -вставлена лишняя буква");
                                vocab[i] = "0";
                            }
                        }
                        temp2 = s.Substring(0, (a + 1)) + ' ' + s.Substring(a + 1);
                    }
                }
 
            }
 
        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            text1.Clear();
            text2.Clear();
           
        }
 
        private void Button3_Click(object sender, RoutedEventArgs e)
        {
 
            text2.Text = s;
            string z = text2.Text;
            string[] vocab = new string[1];
           // string rez = "";
            int count = 0;
            string temp1;
            string temp2 = ' ' + z;
            for (int i = 0; i < 1; i++)
            {
                vocab[i] = text1.Text;
                list.Items.Add(vocab[i]);
            }
            for(int i = 0; i < 1; i++)
            {
                if(z==vocab[i]) // если слова совпадают
                {
                    list.Items.Add(vocab[i]+" -совпадение");
                    vocab[i] = "0";
                    // MessageBox.Show("Все верно");
                }
 
                else if (z.Length == vocab[i].Length) //если буква заменена 
                {
                    count = 0;
                    for (int j = 0; j < vocab[i].Length; j++)
                    {
                        if (vocab[i].Substring(j, 1) == String.Concat(z[j])) count++;
 
                        if (j == vocab[i].Length - 1 && count == z.Length - 1)
                        {
                            list.Items.Add(vocab[i] + " -заменена буква");
                            vocab[i] = "0";
                        }
                    }
                }
                //если буква пропущена 
                else if (z.Length - 1 == vocab[i].Length)
                {
                    for (int a = 0; a < z.Length; a++)
                    {
                        temp1 = z.Remove(a, 1);
                        count = 0;
                        for (int j = 0; j < vocab[i].Length; j++)
                        {
                            if (vocab[i].Substring(j, 1) == String.Concat(temp1[j])) count++;
 
                            if (j == vocab[i].Length - 1 && count == z.Length - 1)
                            {
                                list.Items.Add(vocab[i] + " -пропущена буква");
                                vocab[i] = "0";
                            }
                        }
                    }
                }
                else //если вставленна лишняя буква
                {
                    for (int a = 0; a < vocab[i].Length; a++)
                    {
                        count = 0;
                        for (int j = 0; j < s.Length + 1; j++)
                        {
                            if (vocab[i].Substring(j, 1) == String.Concat(temp2[j])) count++;
 
                            if (j == vocab[i].Length - 1 && count == s.Length)
                            {
                                list.Items.Add(vocab[i] + " -вставлена лишняя буква");
                                vocab[i] = "0";
                            }
                        }
                        temp2 = s.Substring(0, (a + 1)) + ' ' + s.Substring(a + 1);
                    }
                }
 
            }
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2018, 14:18
Ответы с готовыми решениями:

Как реализовать нечеткий поиск, используя алгоритм Левенштейна?
Необходимо сделать так,чтобы при вводе текста появлялись схожие слова. Сравниваемые слова находятся...

Нечеткий поиск по столбцу
Добрый день. Есть столбец в DataTable с адресами типа (&quot;Ростовская область, г. Ростов-на-Дону,...

Нечеткий поиск
Добрый день! Возможно ли в принципе полностью автоматически со 100% точностью &quot;распознать&quot; адреса?...

Нечеткий поиск
НУЖНА ПОМОЩЬ. РАЗРАБОТАН АЛГОРИТМ СРАВНЕНИЯ СТРОК, ОПРЕДЕЛЯЕТ ДО ДВУХ ОШИБОК, ГДЕ ОН МОЖЕТ БЫТЬ...

6
Модератор
Эксперт .NET
15836 / 10984 / 2852
Регистрация: 21.04.2018
Сообщений: 32,243
Записей в блоге: 2
24.12.2018, 22:14 2
Цитата Сообщение от Julia099 Посмотреть сообщение
Вот наработки кода:
Это не наработки, а издевательство над WPF .....
Я плакать ....
Чуть позже скину как должен выглядеть View WPF для Вашего случая.

Добавлено через 2 часа 34 минуты
Пишу и делаю одновременно.
Для любого WPF решения фактически обязательным является наличие классов реализующего интерфейс INotifyPropertyChanged и ICommand. Я буду использовать две такие реализации
OnPropertyChangedClass
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
    /// <summary>Базовый класс с реализацией INPC </summary>
    public class OnPropertyChangedClass : INotifyPropertyChanged
    {
        #region Событие PropertyChanged и метод для его вызова
        /// <summary>Событие для извещения об изменения свойства</summary>
        public event PropertyChangedEventHandler PropertyChanged;
        /// <summary>Метод для вызова события извещения об изменении свойства</summary>
        /// <param name="prop">Изменившееся свойство</param>
        public void OnPropertyChanged([CallerMemberName]string prop = "")
        {
            string[] names = prop.Split("\\/\r \n()\"\'-".ToArray(), StringSplitOptions.RemoveEmptyEntries);
            switch (names.Length)
            {
                case 0: break;
                case 1:
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
                    break;
                default:
                    OnPropertyChanged(names);
                    break;
            }
 
        }
 
        /// <summary>Метод для вызова события извещения об изменении списка свойств</summary>
        /// <param name="propList">Список имён свойств</param>
        public void OnPropertyChanged(IEnumerable<string> propList)
        {
            foreach (string prop in propList.Where(name => !string.IsNullOrWhiteSpace(name)))
                OnPropertyChanged(prop);
        }
 
        /// <summary>Метод для вызова события извещения об изменении списка свойств</summary>
        /// <param name="propList">Список свойств</param>
        public void OnPropertyChanged(IEnumerable<PropertyInfo> propList)
        {
            foreach (PropertyInfo prop in propList)
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop.Name));
        }
 
        /// <summary>Метод для вызова события извещения об изменении всех свойств</summary>
        /// <param name="propList">Список свойств</param>
        public void OnAllPropertyChanged()
        {
            OnPropertyChanged(GetType().GetProperties());
        }
        #endregion
    }
RelayCommand
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public class RelayCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;
        private readonly Func<object, bool> _canExecute;
        private readonly Action<object> _onExecute;
 
        public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
        {
            _onExecute = execute;
            _canExecute = canExecute;
        }
 
        public bool CanExecute(object parameter)
        {
            if (_canExecute == null) return true;
            return _canExecute.Invoke(parameter);
        }
 
        public void Execute(object parameter)
        {
            _onExecute?.Invoke(parameter);
        }
    }
Добавлено через 39 минут
Для модели нам нужны методы сохранения/чтения списка слов. Метод добавления слова. Метод поиска в списке. И свойство возвращающее список слов.
Вот такая будет модель
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
    /// <summary>Статический класс модели данных</summary>
    public static class FuzzySearch_Model
    {
        static ObservableCollection<string> _listWords;
        /// <summary>Список слов</summary>
        public static ObservableCollection<string> ListWords
        {
            get => _listWords ?? (_listWords = new ObservableCollection<string>());
            private set => _listWords = value;
        }
 
        /// <summary>Сохранение списка слов в файле</summary>
        /// <param name="NameFile">Имя файла</param>
        public static void Save(string NameFile = null)
        {
            if (string.IsNullOrWhiteSpace(NameFile))
                NameFile = "ListWords.txt";
            StreamWriter file = new StreamWriter(NameFile, false, Encoding.Default);
            foreach (string word in ListWords)
                file.WriteLine(word);
            file.Close();
        }
 
        /// <summary>Чтение списка слов из файла</summary>
        /// <param name="NameFile">Имя файла</param>
        public static void Load(string NameFile = null)
        {
            if (string.IsNullOrWhiteSpace(NameFile))
                NameFile = "ListWords.txt";
            StreamReader file = new StreamReader(NameFile, Encoding.Default);
            ListWords = new ObservableCollection<string>(file.ReadToEnd().Split("\r\n ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));
            file.Close();
        }
 
        /// <summary>Добавление слова в список</summary>
        /// <param name="Words">Слово или список слов разделённых переносом строки или пробелом</param>
        public static void AddWord(string Words)
        {
            foreach (string word in Words.Split("\r\n ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
                ListWords.Add(word);
        }
 
        /// <summary>Поиск слова в списке</summary>
        /// <param name="Word">Одно слово</param>
        /// <returns>Результат поиска</returns>
        public static string SearchWord(string Word)
        {
            string[] wordArr = Word.Split("\r\n ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            if (wordArr.Length != 1) return "Ошибка ввода";
            Word = wordArr[0];
            int index = ListWords.IndexOf(Word);
            if (index >= 0) return "Tочное совпадение со словом по индексу " + index;
            /// *************************
            /// Нечёткий поиск
            /// *************************
            return "Результат нечёткого поиска";
        }
    }
Добавлено через 49 минут
Для создания View (окна) нам нужна VM времени разработки. Она будет наследоваться от класса OnPropertyChangedClass и будет базой для реальной VM.
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
    /// <summary>Клас ViewModel for DesignData</summary>
    public class FuzzySearch_VM_DataDesigner : OnPropertyChangedClass
    {
        #region Свойства для привязки элементов отображения
        /// <summary>Свойство для слова поиска</summary>
        public string TextSearch { get => _textSearch; set { _textSearch = value; OnAllPropertyChanged(); } }
        /// <summary>Свойство для слова добавления</summary>
        public string TextAdd { get => _textAdd; set { _textAdd = value; OnAllPropertyChanged(); } }
        /// <summary>Свойство для списка слова</summary>
        public ObservableCollection<string> ListWords { get => _listWords; set { _listWords = value; OnAllPropertyChanged(); } }
        /// <summary>Свойство для собщения с результатами поиска</summary>
        public string TextMessage { get => _textMessage; set { _textMessage = value; OnAllPropertyChanged(); } }
        #endregion
 
        #region Приватные поля
        // Поля для хранения значения свойства
        private string _textSearch;
        private string _textAdd;
        private ObservableCollection<string> _listWords;
        private string _textMessage;
        // Поля для хранения значения команд
        private ICommand _searchComm;
        private ICommand _clearComm;
        private ICommand _addComm;
        private ICommand _saveComm;
        private ICommand _loadComm;
        #endregion
 
        #region Свойства для привязки команд
        /// <summary>Свойство для привязки коммнды</summary>
        public ICommand SearchComm => _searchComm ?? (_searchComm = new RelayCommand(OnSearch));
        /// <summary>Свойство для привязки команды</summary>
        public ICommand ClearComm => _clearComm ?? (_clearComm = new RelayCommand(OnClear));
        /// <summary>Свойство для привязки команды</summary>
        public ICommand AddComm => _addComm ?? (_addComm = new RelayCommand(OnAdd));
        /// <summary>Свойство для привязки команды</summary>
        public ICommand SaveComm => _saveComm ?? (_saveComm = new RelayCommand(OnSave));
        /// <summary>Свойство для привязки команды</summary>
        public ICommand LoadComm => _loadComm ?? (_loadComm = new RelayCommand(OnLoad));
        #endregion
 
        #region Методы для команд
        /// <summary>Метод для вызова из команды</summary>
        /// <param name="Value">Значение привязанного параметра</param>
        public virtual void OnSearch(object Value = null) { }
        /// <summary>Метод для вызова из команды</summary>
        /// <param name="Value">Значение привязанного параметра</param>
        public virtual void OnClear(object Value = null)
        { TextSearch = ""; TextMessage = ""; TextAdd = ""; }
        /// <summary>Метод для вызова из команды</summary>
        /// <param name="Value">Значение привязанного параметра</param>
        public virtual void OnAdd(object Value = null) { }
        /// <summary>Метод для вызова из команды</summary>
        /// <param name="Value">Значение привязанного параметра</param>
        public virtual void OnSave(object Value = null) { }
        /// <summary>Метод для вызова из команды</summary>
        /// <param name="Value">Значение привязанного параметра</param>
        public virtual void OnLoad(object Value = null) { }
        #endregion
    }
Добавлено через 1 минуту
Теперь можно создать View со всеми привязками. В Xaml объявим для удобства VM времени разработки
XML
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
    <d:Window.DataContext>
        <local:FuzzySearch_VM_DataDesigner TextSearch="Слово для поиска" TextAdd="Слово для добавления" TextMessage="Сообщение">
            <local:FuzzySearch_VM_DataDesigner.ListWords>
                <sys:String>Анекдоты</sys:String>
                <sys:String>про</sys:String>
                <sys:String>Вовочку</sys:String>
            </local:FuzzySearch_VM_DataDesigner.ListWords>
        </local:FuzzySearch_VM_DataDesigner>
    </d:Window.DataContext>
    <Grid ShowGridLines="False" Background="Aqua">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <StackPanel>
            <TextBox TextWrapping="Wrap" Text="{Binding TextSearch}" Margin="10"/>
            <Button Content="Поиск"  VerticalAlignment="Bottom" Margin="10" Command="{Binding SearchComm}"/>
        </StackPanel>
        <TextBlock Grid.Column="1" Margin="10" Background="White" Text="{Binding TextMessage}"/>
        <TextBox TextWrapping="Wrap" Text="{Binding TextAdd}" Margin="10" Grid.Row="2"/>
        <ListBox Margin="10" Grid.Row="1" MinHeight="250" Grid.ColumnSpan="3" ItemsSource="{Binding ListWords}"/>
        <Button  Content="Очистить"  VerticalAlignment="Bottom" Margin="10" Grid.Row="0" Grid.Column="2" Command="{Binding ClearComm}"/>
        <Button Content="Добавить"  VerticalAlignment="Center" Margin="10" Grid.Row="2" Grid.Column="1" Command="{Binding AddComm}"/>
        <StackPanel Grid.Row="2" Grid.Column="2">
            <Button Content="Загрузить" Margin="10" Command="{Binding LoadComm}"/>
            <Button Content="Сохранить" Margin="10" Command="{Binding SaveComm}"/>
        </StackPanel>
    </Grid>
Добавлено через 24 минуты
В реальной VM нам надо только установить связь с Model и переопределить методы для кнопок
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    /// <summary>Клас реальной ViewModel</summary>
    public class FuzzySearch_VM : FuzzySearch_VM_DataDesigner
    {
        public FuzzySearch_VM()
        {
            FuzzySearch_Model.Load();
            ListWords = FuzzySearch_Model.ListWords;
        }
 
        public override void OnAdd(object Value = null) => FuzzySearch_Model.AddWord(TextAdd);
        public override void OnLoad(object Value = null) => FuzzySearch_Model.Load();
        public override void OnSave(object Value = null) => FuzzySearch_Model.Save();
        public override void OnSearch(object Value = null) => TextMessage = FuzzySearch_Model.SearchWord(TextSearch);
    }
Всё - наше WPF приложение в простейшем виде работает. Конечно, здесь многого нет. В том числе проверки на ошибки, поэтому файл "ListWords.txt" надо самому создать в папке где находится exe-файл приложения. Иначе будет исключение.
Нет реализации получения имени файла.
Так же нет реализации самого алгоритма нечёткого поиска. Он должен быть прописан в методе SearchWord модели. Но это уже не относится к WPF. В модели есть слово которое надо искать - это параметр Word, список слов в котором искать - это свойство модели ListWords и возвращать метод будет результат поиска. Но сам алгоритм поиска надо писать отдельно. Если не знаете как, то обратитесь в раздел для начинающих. Там недавно была неплохая реализация нечёткого поиска.

Добавлено через 1 минуту
Опаньки! Забыл!
Надо же подключить в Xaml реальною VM!
XML
1
2
3
    <Window.DataContext>
        <local:FuzzySearch_VM/>
    </Window.DataContext>
ОшибкаПеречитывая тему заметил, что в свойствах вызывается метод OnAllPropertyChanged();.
Это случайная ошибка, не заметил её.
Должен вызываться метод OnPropertyChanged();
1
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
25.12.2018, 13:27 3
Элд Хасп, будь добр, выложи пожалуйста проект целиком. Очень полезный и наглядный пример получился.
0
1517 / 908 / 328
Регистрация: 17.05.2015
Сообщений: 3,431
25.12.2018, 14:26 4
Элд Хасп, да, и требуем закрепить его в шапке ветки. Ну или полноценный гайд по mvvm.
я только не пойму, почему не использовать старую простую реализацию inpc и вручную писать изменившиеся свойства
C#
1
2
3
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string prop) =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
по мне так куда быстрее будет работать, чем реализация с рефлексией..(но это не точно)
1
Модератор
Эксперт .NET
15836 / 10984 / 2852
Регистрация: 21.04.2018
Сообщений: 32,243
Записей в блоге: 2
25.12.2018, 16:13 5
Цитата Сообщение от Рядовой Посмотреть сообщение
я только не пойму, почему не использовать старую простую реализацию inpc и вручную писать изменившиеся свойства
Там в одной из веток кода есть эта реализация строка 16 класса OnPropertyChangedClass.
Но кроме того можно вызвать сразу для всех свойств (через рефлексию) или для списка свойств задав их имена или последовательностью, или через разделители.
Необходимость таких способов вызова появилась из практики. Код они не усложняют (пару десятков строк - для базового класса) на скорость обычного вызова OnPropertyChanged() не влияют.

Добавлено через 4 минуты
Цитата Сообщение от SatanaXIII Посмотреть сообщение
будь добр, выложи пожалуйста проект целиком. Очень полезный и наглядный пример получился.
Цитата Сообщение от Рядовой Посмотреть сообщение
требуем закрепить его в шапке ветки. Ну или полноценный гайд по mvvm.
Я его "на коленках" делал в "общей свалке" решений. Вытащу в отдельный проект - выложу.
0
Модератор
Эксперт .NET
15836 / 10984 / 2852
Регистрация: 21.04.2018
Сообщений: 32,243
Записей в блоге: 2
26.12.2018, 06:07 6
SatanaXIII, Рядовой, создал тему в шапке. Архив проекта там.
1
Модератор
Эксперт .NET
15836 / 10984 / 2852
Регистрация: 21.04.2018
Сообщений: 32,243
Записей в блоге: 2
13.05.2019, 13:27 7
Рядовой,
Цитата Сообщение от Рядовой Посмотреть сообщение
по мне так куда быстрее будет работать, чем реализация с рефлексией..(но это не точно)
Перечитывая другую тему понял что в этой ошибка.
ОшибкаВ свойствах вызывается метод OnAllPropertyChanged();.
Это случайная ошибка, не заметил её.
Должен вызываться метод OnPropertyChanged();

Из-за не внимательности не понял Вас первоначально.
0
13.05.2019, 13:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2019, 13:27
Помогаю со студенческими работами здесь

Нечеткий поиск
Как сделать нечеткий &quot;правильный&quot; поиск. Dim query As String query=&quot;Шери&quot;...

Нечеткий поиск
Всем доброго времени суток! Ребят подскажите,пожалуйста, суть.Нужно организовать нечеткий поиск в...

Нечеткий поиск по словам
Нашел пример нечеткого поиска слова в таблице Excel (ссылка). Не получается переделать под Access....

Нечеткий поиск в базе данных
Добрый день, проблема состоит в следующем: нужно написать &quot;нечеткий поиск&quot; для базы данных SQL....


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

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