2016-01-19 5 views
3

Мне нужно отфильтровать внутреннюю коллекцию коллекции с помощью LINQ для извлечения записей.Как фильтровать внутреннюю коллекцию с помощью LINQ C#

public class MobileModel : Notify 
{ 
    private string _brand = string.Empty; 
    private ObservableCollection<MobileModelInfo> _model = new ObservableCollection<MobileModelInfo>(); 
    private string _os = string.Empty; 

    public string Brand 
    { 
     get { return _brand; } 
     set { _brand = value; OnPropertyChanged(); } 
    } 
    public ObservableCollection<MobileModelInfo> Model 
    { 
     get { return _model; } 
     set { _model = value; OnPropertyChanged(); } 
    } 

    public string OS 
    { 
     get { return _os; } 
     set { _os = value; OnPropertyChanged(); } 
    } 
} 

public class MobileModelInfo 
{ 
    public string Name { get; set; } 
    public string Catagory { get; set; } 
    public string Year { get; set; } 
} 


public void GetMobile() 
    { 
     List<MobileModel> mList = new List<MobileModel>(); 
     List<MobileModelInfo> modList = new List<MobileModelInfo>(); 
     MobileModel mob = new MobileModel(); 

     modList.Clear(); 
     mob.Brand = "Apple"; 
     modList.Add(new MobileModelInfo { Name = "iPhone 4", Catagory = "Smart Phone", Year = "2011" }); 
     modList.Add(new MobileModelInfo { Name = "iPhone 5", Catagory = "Smart Phone", Year = "2013" }); 
     modList.Add(new MobileModelInfo { Name = "iPhone 6", Catagory = "Premium Smart Phone", Year = "2015" }); 
     mob.Model = new ObservableCollection<MobileModelInfo>(modList); 
     mob.OS = "IOS"; 
     mList.Add(mob); 

     mob = new MobileModel(); 
     modList.Clear(); 
     mob.Brand = "Samsung"; 
     modList.Add(new MobileModelInfo { Name = "S4", Catagory = "Smart Phone", Year = "2011" }); 
     modList.Add(new MobileModelInfo { Name = "S5", Catagory = "Smart Phone", Year = "2013" }); 
     modList.Add(new MobileModelInfo { Name = "S6", Catagory = "Ultra Smart Phone", Year = "2015" }); 
     mob.Model = new ObservableCollection<MobileModelInfo>(modList); 
     mob.OS = "Android"; 
     mList.Add(mob); 

     mob = new MobileModel(); 
     modList.Clear(); 
     mob.Brand = "MicroSoft"; 
     modList.Add(new MobileModelInfo { Name = "Lumina 9900", Catagory = "Phone", Year = "2011" }); 
     modList.Add(new MobileModelInfo { Name = "Opera X220", Catagory = "Smart Phone", Year = "2013" }); 
     mob.Model = new ObservableCollection<MobileModelInfo>(modList); 
     mob.OS = "Windows"; 
     mList.Add(mob); 

     mob = new MobileModel(); 
     modList.Clear(); 
     mob.Brand = "Sony Ericssion"; 
     modList.Add(new MobileModelInfo { Name = "S4", Catagory = "Smart Phone", Year = "2011" }); 
     modList.Add(new MobileModelInfo { Name = "S5", Catagory = "Smart Phone", Year = "2013" }); 
     modList.Add(new MobileModelInfo { Name = "S6", Catagory = "Ultra Smart Phone", Year = "2015" }); 
     mob.Model = new ObservableCollection<MobileModelInfo>(modList); 
     mob.OS = "Android"; 
     mList.Add(mob); 

     MobileList = new ObservableCollection<MobileModel>(mList); 
    } 

ObservableCollection MobileList имеет три свойства Бренд, Модель и ОС. Свойство Model снова является ObservableCollection в том, что класс MobileModelInfo имеет три свойства Name, Catagory и Year.

Мне нужна коллекция, которая должна содержать год во внутренней коллекции MobileModelInfo. Остальные записи не нужны.

В Samsung он должен содержать только

mob.Brand = "Samsung"; 
modList.Add(new MobileModelInfo { Name = "S4", Catagory = "Smart Phone", Year = "2011" }); 
mob.OS = "Android"; 

Фактический начальный выходной снимок экрана Original List without Filter

Выход ожидается в After Filter

+0

Если не Linq, вы можете перебирать элементы модели и получить список. – Vini

ответ

4
var filtered = MobileList.Select(m => new MobileModel { 
       Model = new ObservableCollection(m.Model.Where(model => model.Year == "2011").ToList()), 
       Brand = m.Brand, 
       OS = m.OS 
      }) 

;

+0

У меня ошибка Невозможно неявно преобразовать тип 'System.Collections.Generic. Список 'to' System.Collections.ObjectModel.ObservableCollection ' –

+0

Я улучшил свой ответ, чтобы использовать ObservableCollection –

+0

Он возвращает пустое значение для бренда свойств и ОС –

5

SelectMany() использование:

MobileList.SelectMany(x => x.Model).Where(m=>m.Year==2011)

+0

Используйте LINQ в свойстве MobileList, а не в mList. –

+0

Внешняя коллекция не указана. Нам нужно исключить год, который не равен 2011 году. Но ваш результат LINQ приводит только к MobileModelInfo Collection, а не к MobileModel. –

+0

Я думаю, что это может быть полезно MobileList.Where (x => x.Model.Any (m => m.Year == 2011)) –

2

Я думаю, что вы можете использовать внутренним, где условия для this.Pls проверить это:

var result = MobileList.Where(m => m.Model.Where(mdl => mdl.Year =="2011")).ToList(); 
+0

В условии where мы должны дать выражение bool вместо внутреннего. Это приведет к ошибке времени компиляции. –

+0

возможно, должен использовать любой, а не где-то вроде «MobileList.Where» (m => m.Model.Any (mdl => mdl.Year == "2011")). ToList(); '. Но извините, я не могу ответить на эти вопросы. –

Смежные вопросы