LINQ-фильтрация из viewModel и List <> - PullRequest
2 голосов
/ 27 марта 2012

Мне нужна помощь с синтаксисом или методологией LINQ, не знаю, какой именно.

Вот моя проблема: у меня есть список предметов (Билл, Боб, Эд), и мне нужно выбрать и отфильтровать все, что выбрал пользователь. Таким образом, если viewModel содержит «Bob», то оператор LINQ должен вернуть «Bill», «Ed.» Хитрость заключается в том, что пользователь может выбирать несколько вещей, поэтому viewModel может содержать «Ed», «Bob», и поэтому оператор LINQ должен возвращать только «Bill».

ViewModel - это IEnumerable, а список элементов - это List <>. В качестве отправной точки у меня есть что-то простое:

c.Items.select(p=>p.Name) 

где c.Items относится к Биллу, Бобу и Эду выше. Теперь мне просто нужно отфильтровать выборки viewModel, и я борюсь с синтаксисом LINQ. Я пробовал варианты на! = ViewModel.selectedNames, которые ни к чему не привели, некоторые варианты с использованием .contains и один с использованием всех.

var filteredItems = viewModel.selectedNames;
c.Items.Where(p => filteredItems.All(t => !p.Name.Contains(t)));

Я сейчас чувствую себя обиженным.

1 Ответ

2 голосов
/ 27 марта 2012

Возможно, что-то вроде:

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"); };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...