У меня есть ObservableCollection, а именно MobileList типа MobileModel. MobileModel имеет список MobileModelInfo.

Мне нужно только MobileModelInfo из этого MobileList. Поэтому я использовал оператор Linq Select в методе ExtractFirstMobileList(). Но я не могу назначить Список, он показывает ошибку.

Мой исходный код на C #:

public class Mobile
{
    private ObservableCollection<MobileModel> _mobileList;
    public ObservableCollection<MobileModel> MobileList
    {
        get { return _mobileList; }
        set { _mobileList = value; OnPropertyChanged(); }
    }

    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);

        ExtractFirstMobileList(MobileList);

    }


    public void ExtractFirstMobileList(ObservableCollection<MobileModel> Source)
    {
        List<MobileModelInfo> mInfo = Source.Select(t=> t.Model);
    }

}

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

    public string Brand
    {
        get { return _brand; }
        set { _brand = value; OnPropertyChanged(); }
    }
    public List<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; }
}

Пожалуйста, помогите мне преобразовать Ienumerable в предпочтительный тип.

1
B.Balamanigandan 30 Дек 2015 в 09:36

3 ответа

Лучший ответ

Если вы хотите создать плоский список со всеми различными MobileModelInfo, вы можете использовать SelectMany:

List<MobileModelInfo> mInfo = Source.SelectMany(t => t.Model).ToList();

Но ваш метод называется ExtractFirstMobileList, что предполагает, что вам нужен первый элемент в каждом подсписке - в этом случае вы можете использовать:

List<MobileModelInfo> mInfo = Source.Select(t => t.Model.First()).ToList();

Надеюсь это поможет

5
Zrethreal 30 Дек 2015 в 07:37

Свойство Model в классе MobileModel - это сам список. Таким образом, используемый вами запрос выбора вернет коллекцию коллекций MobileModelInfo (тип возврата IEnumerable >)

Чтобы преобразовать это в список >, добавьте в конец .ToList ().

List<List<MobileModelInfo>> mInfo = Source.Select(t => t.Model).ToList();
3
chijos 30 Дек 2015 в 06:48

Если вам нужно извлечь список с помощью LINQ, используйте метод ToList() после метода Select(). Также убедитесь, что ваш список не пуст, он существует и содержит более 0 элементов.

1
Andrew 30 Дек 2015 в 07:22