从viewModel和List<>进行LINQ过滤

时间:2012-03-26 21:22:39

标签: linq c#-4.0

我需要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)));

我现在感觉有胡子了。

1 个答案:

答案 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"); };
}