我需要LINQ语法或方法的帮助,不知道哪个。
这是我的问题:我有一个项目列表(Bill,Bob,Ed),我需要选择并过滤掉用户选择的任何内容。因此,如果viewModel包含“Bob”,则LINQ语句应返回“Bill”,“Ed”。诀窍是用户可以选择多个东西,因此viewModel可以包含“Ed”,“Bob”,因此LINQ语句应该只返回“Bill”。
viewModel是IEnumerable,项目列表是List<&gt ;.我有一些简单的东西作为起点:
c.Items.select(p=>p.Name)
其中c.Items指的是Bill,Bob和Ed。现在我只需要过滤掉viewModel选项,并且我正在努力使用LINQ语法。我尝试过变种!= viewModel.selectedNames,它们无处可去,一些变种使用.contains,一个使用all。
var filteredItems = viewModel.selectedNames;
c.Items.Where(p => filteredItems.All(t => !p.Name.Contains(t)));
我现在感觉有胡子了。
答案 0 :(得分:2)
也许是这样的:
var filteredNames = new HashSet<string>(viewModel.SelectedNames);
// nb: this is not strictly the same as your example code,
// but perhaps what you intended
c.Items.Where(p => !filteredNames.Contains(p.Name));
再看一下,也许你应该稍微重新构建你的视图模型:
public class PeopleViewModel : ViewModelBaseOfYourLiking
{
public ObservableCollection<Person> AllPeople
{
get;
private set;
}
public ObservableCollection<Person> SelectedPeople
{
get;
private set;
}
public IEnumerable<Person> ValidPeople
{
get { return this.AllPeople.Except(this.SelectedPeople); }
}
// ...
此时您将在视图中进行接线:
<ListBox ItemSource="{Binding AllPeople}"
SelectedItems="{Binding SelectedPeople}" />
<ItemsControl ItemsSource="{Binding ValidPeople}" />
在视图模型的构造函数中,您将应用适当的事件以确保ValidPeople
在需要时得到更新:
public PeopleViewModel(IEnumerable<Person> people)
{
this.AllPeople = new ObservableCollection<Person>(people);
this.SelectedPeople = new ObservableCollection<Person>();
// wire up events to track ValidPeople (optionally do the same to AllPeople)
this.SelectedPeople.CollectionChanged
+= (sender,e) => { this.RaisePropertyChanged("ValidPeople"); };
}