|
@@ -1,110 +1,6 @@
|
|
|
# Поиск, сортировка ("Университет")
|
|
|
## Поиск
|
|
|
```
|
|
|
-using System;
|
|
|
-using System.Collections.Generic;
|
|
|
-using System.Linq;
|
|
|
-using System.Windows;
|
|
|
-using System.Windows.Controls;
|
|
|
-using System.Windows.Input;
|
|
|
-
|
|
|
-namespace University
|
|
|
-{
|
|
|
- public partial class MainWindow : Window
|
|
|
- {
|
|
|
- private List<Student> students;
|
|
|
- private Dictionary<string, Func<Student, bool>> filters;
|
|
|
- private AgeRange selectedAge = new AgeRange { ageFrom = 19, ageTo = 23 };
|
|
|
- private string searchFilter = "";
|
|
|
-
|
|
|
- public MainWindow()
|
|
|
- {
|
|
|
- InitializeComponent();
|
|
|
- SearchFilterTextBox.KeyUp += SearchFilter_KeyUp;
|
|
|
- InitializeData();
|
|
|
-
|
|
|
- // Отображаем всех студентов в listview
|
|
|
- UpdateStudentList(students);
|
|
|
- }
|
|
|
-
|
|
|
- private void InitializeData()
|
|
|
- {
|
|
|
- // Создаем список студентов
|
|
|
- students = new List<Student>
|
|
|
- {
|
|
|
- new Student { Name = "Хэй Вэнь", Course = 3, Nationality = "Китаец", Age = 22 },
|
|
|
- new Student { Name = "Эдвард Каллен", Course = 1, Nationality = "Американец", Age = 20 },
|
|
|
- new Student { Name = "Джейк Ли", Course = 1, Nationality = "Китаец", Age = 19 },
|
|
|
- new Student { Name = "Семен Хомяк", Course = 4, Nationality = "Русский", Age = 23 },
|
|
|
- new Student { Name = "Эндрю Уилсон", Course = 3, Nationality = "Американец", Age = 21 },
|
|
|
- new Student { Name = "Ариадна Санчес", Course = 2, Nationality = "Испанец", Age = 20 }
|
|
|
- };
|
|
|
-
|
|
|
- // Создаем словарь фильтров
|
|
|
- filters = new Dictionary<string, Func<Student, bool>>
|
|
|
- {
|
|
|
- { "Все", s => true },
|
|
|
- { "Первый курс", s => s.Course == 1 },
|
|
|
- { "Второй курс", s => s.Course == 2 },
|
|
|
- { "Третий курс", s => s.Course == 3 },
|
|
|
- { "Четвертый курс", s => s.Course == 4 },
|
|
|
- { "Русские", s => s.Nationality == "Русский" },
|
|
|
- { "Китайцы", s => s.Nationality == "Китаец" },
|
|
|
- { "Американцы", s => s.Nationality == "Американец" },
|
|
|
- { "Испанцы", s => s.Nationality == "Испанец" },
|
|
|
- { "Возраст 19-20", s => s.Age >= 19 && s.Age <= 20 },
|
|
|
-
|
|
|
- { "Возраст 21-23", s => s.Age >= 21 && s.Age <= 23 }
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
- private IEnumerable<Student> FilteredStudentList
|
|
|
- {
|
|
|
- get
|
|
|
- {
|
|
|
- // сохраняем во временную переменную полный список
|
|
|
- var res = students;
|
|
|
-
|
|
|
- // фильтруем по возрасту
|
|
|
- res = (List<Student>)res.Where(s => (s.Age >= selectedAge.ageFrom && s.Age < selectedAge.ageTo));
|
|
|
-
|
|
|
- // если фильтр не пустой, то ищем ВХОЖДЕНИЕ подстроки поиска в имени без учета регистра
|
|
|
- if (searchFilter != "")
|
|
|
- res = (List<Student>)res.Where(s => s.Name.IndexOf(searchFilter, StringComparison.OrdinalIgnoreCase) >= 0);
|
|
|
-
|
|
|
- return res;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void UpdateStudentList(List<Student> studentsToDisplay)
|
|
|
- {
|
|
|
- StudentListView.ItemsSource = studentsToDisplay;
|
|
|
- }
|
|
|
-
|
|
|
- private void SearchFilter_KeyUp(object sender, KeyEventArgs e)
|
|
|
- {
|
|
|
- searchFilter = SearchFilterTextBox.Text;
|
|
|
- UpdateStudentList(FilteredStudentList.ToList());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public class Student
|
|
|
- {
|
|
|
- public string Name { get; set; }
|
|
|
- public int Course { get; set; }
|
|
|
- public string Nationality { get; set; }
|
|
|
- public int Age { get; set; }
|
|
|
- }
|
|
|
-
|
|
|
- public class AgeRange
|
|
|
- {
|
|
|
- public int ageFrom { get; set; }
|
|
|
- public int ageTo { get; set; }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-```
|
|
|
-```
|
|
|
<Window x:Class="University.MainWindow"
|
|
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
@@ -113,50 +9,67 @@ namespace University
|
|
|
xmlns:local="clr-namespace:University"
|
|
|
mc:Ignorable="d"
|
|
|
Title="University" Height="450" Width="800">
|
|
|
- <Grid>
|
|
|
- <Grid.RowDefinitions>
|
|
|
- <RowDefinition Height="Auto" />
|
|
|
- <RowDefinition Height="*" />
|
|
|
- </Grid.RowDefinitions>
|
|
|
+ <Grid>
|
|
|
+ <Grid.RowDefinitions>
|
|
|
+ <RowDefinition Height="Auto" />
|
|
|
+ <RowDefinition Height="*" />
|
|
|
+ </Grid.RowDefinitions>
|
|
|
+
|
|
|
+ <StackPanel Orientation="Horizontal" Margin="10">
|
|
|
|
|
|
- <StackPanel Orientation="Horizontal" Margin="10">
|
|
|
<Label
|
|
|
- Content="искать"
|
|
|
- VerticalAlignment="Center"/>
|
|
|
+Content="искать"
|
|
|
+VerticalAlignment="Center"/>
|
|
|
<TextBox
|
|
|
- Width="200"
|
|
|
- VerticalAlignment="Center"
|
|
|
- x:Name="SearchFilterTextBox"
|
|
|
- KeyUp="SearchFilter_KeyUp"/>
|
|
|
+Width="200"
|
|
|
+VerticalAlignment="Center"
|
|
|
+x:Name="SearchFilterTextBox"
|
|
|
+KeyUp="SearchFilter_KeyUp"/>
|
|
|
+ <Label
|
|
|
+ Content="Возраст:"
|
|
|
+ VerticalAlignment="Center"/>
|
|
|
+ <RadioButton
|
|
|
+ GroupName="Age"
|
|
|
+ Tag="1"
|
|
|
+ Content="по возрастанию"
|
|
|
+ IsChecked="True"
|
|
|
+ Checked="RadioButton_Checked"
|
|
|
+ VerticalAlignment="Center"/>
|
|
|
+ <RadioButton
|
|
|
+ GroupName="Age"
|
|
|
+ Tag="2"
|
|
|
+ Content="по убыванию"
|
|
|
+ Checked="RadioButton_Checked"
|
|
|
+ VerticalAlignment="Center"/>
|
|
|
</StackPanel>
|
|
|
|
|
|
- <ListView x:Name="StudentListView" Grid.Row="1" Margin="10">
|
|
|
- <ListView.View>
|
|
|
- <GridView>
|
|
|
- <GridViewColumn Header="Имя" DisplayMemberBinding="{Binding Name}" />
|
|
|
- <GridViewColumn Header="Курс" DisplayMemberBinding="{Binding Course}" />
|
|
|
- <GridViewColumn Header="Национальность" DisplayMemberBinding="{Binding Nationality}" />
|
|
|
- <GridViewColumn Header="Возраст" DisplayMemberBinding="{Binding Age}" />
|
|
|
- </GridView>
|
|
|
- </ListView.View>
|
|
|
- </ListView>
|
|
|
- </Grid>
|
|
|
+ <ListView x:Name="StudentListView" Grid.Row="1" Margin="10">
|
|
|
+ <ListView.View>
|
|
|
+ <GridView>
|
|
|
+ <GridViewColumn Header="Имя" DisplayMemberBinding="{Binding Name}" />
|
|
|
+ <GridViewColumn Header="Курс" DisplayMemberBinding="{Binding Course}" />
|
|
|
+ <GridViewColumn Header="Национальность" DisplayMemberBinding="{Binding Nationality}" />
|
|
|
+ <GridViewColumn Header="Возраст" DisplayMemberBinding="{Binding Age}" />
|
|
|
+ </GridView>
|
|
|
+ </ListView.View>
|
|
|
+ </ListView>
|
|
|
+ </Grid>
|
|
|
</Window>
|
|
|
```
|
|
|
-![](./img/Снимок%20экрана%202024-04-27%20222231.png)
|
|
|
-## Сортировка
|
|
|
```
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Windows;
|
|
|
using System.Windows.Controls;
|
|
|
+using System.Windows.Input;
|
|
|
|
|
|
namespace University
|
|
|
{
|
|
|
public partial class MainWindow : Window
|
|
|
{
|
|
|
private List<Student> students;
|
|
|
+ private string searchFilter = "";
|
|
|
private bool sortAsc = true;
|
|
|
|
|
|
public MainWindow()
|
|
@@ -169,18 +82,28 @@ namespace University
|
|
|
// Отображаем всех студентов в listview
|
|
|
UpdateStudentList(students);
|
|
|
}
|
|
|
+ private void SearchFilter_KeyUp(object sender, KeyEventArgs e)
|
|
|
+ {
|
|
|
+ searchFilter = SearchFilterTextBox.Text;
|
|
|
+ Invalidate();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void Invalidate()
|
|
|
+ {
|
|
|
+ throw new NotImplementedException();
|
|
|
+ }
|
|
|
|
|
|
private void InitializeData()
|
|
|
{
|
|
|
// Создаем список студентов
|
|
|
students = new List<Student>
|
|
|
{
|
|
|
- new Student { Name = "Хэй Вэнь", Course = 3, Nationality = "Китаец", Age = 22 },
|
|
|
- new Student { Name = "Эдвард Каллен", Course = 1, Nationality = "Американец", Age = 19 },
|
|
|
new Student { Name = "Джейк Ли", Course = 1, Nationality = "Китаец", Age = 19 },
|
|
|
+ new Student { Name = "Ариадна Санчес", Course = 2, Nationality = "Испанец", Age = 20 },
|
|
|
+ new Student { Name = "Эдвард Каллен", Course = 1, Nationality = "Американец", Age = 20 },
|
|
|
+ new Student { Name = "Эндрю Уилсон", Course = 3, Nationality = "Американец", Age = 21 },
|
|
|
+ new Student { Name = "Хэй Вэнь", Course = 3, Nationality = "Китаец", Age = 22 },
|
|
|
new Student { Name = "Семен Хомяк", Course = 4, Nationality = "Русский", Age = 23 },
|
|
|
- new Student { Name = "Эндрю Уилсон", Course = 2, Nationality = "Американец", Age = 21 },
|
|
|
- new Student { Name = "Мария Гонсалес", Course = 3, Nationality = "Испанец", Age = 20 }
|
|
|
};
|
|
|
}
|
|
|
|
|
@@ -188,7 +111,7 @@ namespace University
|
|
|
{
|
|
|
List<Student> filteredStudents = new List<Student>();
|
|
|
|
|
|
-
|
|
|
+ // Фильтруем список студентов по выбранному критерию
|
|
|
|
|
|
UpdateStudentList(filteredStudents);
|
|
|
}
|
|
@@ -204,6 +127,21 @@ namespace University
|
|
|
InvalidateVisual(); // Исправлено имя метода
|
|
|
}
|
|
|
|
|
|
+ private void SortByAgeButton_Click(object sender, RoutedEventArgs e)
|
|
|
+ {
|
|
|
+ // Сортируем список студентов по возрасту
|
|
|
+ List<Student> sortedStudents = students.OrderBy(student => student.Age).ToList();
|
|
|
+
|
|
|
+ // Если нужно отсортировать по убыванию, разворачиваем список
|
|
|
+ if (!sortAsc)
|
|
|
+ {
|
|
|
+ sortedStudents.Reverse();
|
|
|
+ }
|
|
|
+
|
|
|
+ // Обновляем список студентов в ListView
|
|
|
+ UpdateStudentList(sortedStudents);
|
|
|
+ }
|
|
|
+
|
|
|
private IEnumerable<Student> FilteredStudentList
|
|
|
{
|
|
|
get
|
|
@@ -225,51 +163,4 @@ namespace University
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
-```
|
|
|
-<Window x:Class="University.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:University"
|
|
|
- mc:Ignorable="d"
|
|
|
- Title="University" Height="450" Width="800">
|
|
|
- <Grid>
|
|
|
- <Grid.RowDefinitions>
|
|
|
- <RowDefinition Height="Auto" />
|
|
|
- <RowDefinition Height="*" />
|
|
|
- </Grid.RowDefinitions>
|
|
|
-
|
|
|
- <StackPanel Orientation="Horizontal" Margin="10">
|
|
|
- <Label
|
|
|
- Content="Возраст:"
|
|
|
- VerticalAlignment="Center"/>
|
|
|
- <RadioButton
|
|
|
- GroupName="Age"
|
|
|
- Tag="1"
|
|
|
- Content="по возрастанию"
|
|
|
- IsChecked="True"
|
|
|
- Checked="RadioButton_Checked"
|
|
|
- VerticalAlignment="Center"/>
|
|
|
- <RadioButton
|
|
|
- GroupName="Age"
|
|
|
- Tag="2"
|
|
|
- Content="по убыванию"
|
|
|
- Checked="RadioButton_Checked"
|
|
|
- VerticalAlignment="Center"/>
|
|
|
- </StackPanel>
|
|
|
-
|
|
|
- <ListView x:Name="StudentListView" Grid.Row="1" Margin="10">
|
|
|
- <ListView.View>
|
|
|
- <GridView>
|
|
|
- <GridViewColumn Header="Имя" DisplayMemberBinding="{Binding Name}" />
|
|
|
- <GridViewColumn Header="Курс" DisplayMemberBinding="{Binding Course}" />
|
|
|
- <GridViewColumn Header="Национальность" DisplayMemberBinding="{Binding Nationality}" />
|
|
|
- <GridViewColumn Header="Возраст" DisplayMemberBinding="{Binding Age}" />
|
|
|
- </GridView>
|
|
|
- </ListView.View>
|
|
|
- </ListView>
|
|
|
- </Grid>
|
|
|
-</Window>
|
|
|
-```
|
|
|
-![](./img/Снимок%20экрана%202024-04-28%20203454.png)
|
|
|
+![](./img/Снимок%20экрана%202024-04-29%20083601.png)
|