Поиск, сортировка ("Университет")
Поиск
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"
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"/>
<TextBox
Width="200"
VerticalAlignment="Center"
x:Name="SearchFilterTextBox"
KeyUp="SearchFilter_KeyUp"/>
</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>
Сортировка
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
namespace University
{
public partial class MainWindow : Window
{
private List<Student> students;
private bool sortAsc = true;
public MainWindow()
{
InitializeComponent();
// Инициализируем список студентов
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 = 19 },
new Student { Name = "Джейк Ли", Course = 1, Nationality = "Китаец", Age = 19 },
new Student { Name = "Семен Хомяк", Course = 4, Nationality = "Русский", Age = 23 },
new Student { Name = "Эндрю Уилсон", Course = 2, Nationality = "Американец", Age = 21 },
new Student { Name = "Мария Гонсалес", Course = 3, Nationality = "Испанец", Age = 20 }
};
}
private void FilterComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
List<Student> filteredStudents = new List<Student>();
UpdateStudentList(filteredStudents);
}
private void UpdateStudentList(List<Student> studentsToDisplay)
{
StudentListView.ItemsSource = studentsToDisplay;
}
private void RadioButton_Checked(object sender, RoutedEventArgs e)
{
sortAsc = (sender as RadioButton).Tag.ToString() == "1";
InvalidateVisual(); // Исправлено имя метода
}
private IEnumerable<Student> FilteredStudentList
{
get
{
// сохраняем во временную переменную полный список
var res = students;
return res;
}
}
}
class Student
{
public string Name { get; set; }
public int Course { get; set; }
public string Nationality { get; set; }
public int Age { 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"
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>