Самая универсальная коллекция - это ObservableCollection.Вы можете передать ему список в конструкторе.Через LINQ вы можете сортировать и фильтровать.Вы также можете сортировать и фильтровать в XAML, используя CollectionViewSource, но фильтрация сложна.И отдельные элементы должны реализовывать iNotitifyPropertyChanged.Я знаю только WPF.
Если вы скрываете фильтр за публичным свойством, вы можете принудительно пересмотреть его.Может привести тебя туда, где ты должен быть.
public partial class MainWindow : Window
{
ObservableCollection<person> Persons = new ObservableCollection<person>();
public MainWindow()
{
InitializeComponent();
Persons.Add(new person("jim", 12));
Persons.Add(new person("aa", 13));
Persons.Add(new person("ff", 14));
Persons.Add(new person("dd", 22));
Persons.Add(new person("hky", 23));
Persons.Add(new person("jsgdim", 24));
List<person> YoungPersons = Persons.Where(per => per.Age < 20).ToList();
Debug.WriteLine(Persons.Count.ToString());
Debug.WriteLine(YoungPersons.Count.ToString());
Debug.WriteLine(YoungPersonsProperty.Count.ToString());
Persons[0].Name = "Jimmy";
Debug.WriteLine(Persons[0].Name);
Debug.WriteLine(YoungPersons[0].Name);
Debug.WriteLine(YoungPersonsProperty[0].Name);
Persons.Remove(Persons[0]);
Debug.WriteLine(Persons.Count.ToString());
Debug.WriteLine(YoungPersons.Count.ToString());
Debug.WriteLine(YoungPersonsProperty.Count.ToString());
string testName;
DateTime startTime = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
testName = YoungPersonsProperty[0].Name;
}
DateTime endTime = DateTime.Now;
TimeSpan ts = endTime - startTime;
Debug.WriteLine(ts.Milliseconds.ToString());
}
public List<person> YoungPersonsProperty
{
get { return Persons.Where(per => per.Age < 20).ToList(); }
}
public class person : INotifyPropertyChanged
{
string name;
int age;
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public int Age { get { return age; } }
public string Name
{
get { return name; }
set
{
name = value;
NotifyPropertyChanged("Name");
}
}
public person (string Name, int Age)
{
name = Name;
age = Age;
}
}
}
Я помню, как фильтр LINQ применялся динамически, не скрывая их за свойством, но я не помню, как.