Как инициализировать или получить коллекцию объектов класса в C#

#c# #android #xamarin #collections #xamarin.android

#c# #Android #xamarin #Коллекции #xamarin.android

Вопрос:

Я пытаюсь получить список установленных приложений из диспетчера пакетов. Я не знаю, как инициализировать или получить список. Это должно быть просто, но мне просто не хватает ссылки или шага.

 List<PackageInfo> packageInfo = PackageManager
                  .GetInstalledApplications(PackageInfoFlags.MetaData);
  

Ошибка CS0266 Не удается неявно преобразовать тип ‘System.Коллекции.Универсальный.Я перечисляю ‘в’систему.Коллекции.Generic.List’. Существует явное преобразование (вам не хватает приведения?)

Ответ №1:

В конце вам понадобится простой оператор преобразования.

 List<PackageInfo> packageInfo = PackageManager
                  .GetInstalledApplications(PackageInfoFlags.MetaData) as List<PackageInfo>;
  

Комментарии:

1. Спасибо. Теперь я знаю, как я мог бы также выполнить приведение List .

Ответ №2:

В зависимости от ваших потребностей вы можете придерживаться IList

 IList<PackageInfo> packageInfo = PackageManager
    .GetInstalledPackages(PackageInfoFlags.MetaData);
  

Если вам действительно нужен экземпляр List call ToList (требуется using System.Linq; )

 List<PackageInfo> packageInfo = PackageManager
    .GetInstalledPackages(PackageInfoFlags.MetaData)
    .ToList();
  

Комментарии:

1. Будет ли приведение его к List<PackageInfo> более производительному по сравнению с вызовом ToList() ?

2. @S.tenBrinke если GetInstalledApplications возвращает фактический List экземпляр, то ToList вызов не будет выполнять итерацию через collection и выполнит копирование массива, что довольно быстро, но да, в этом случае приведение выполняется более производительно. Но если GetInstalledApplications возвращает что-либо еще, влияющее на IList интерфейс, но это не так, List тогда ToList будет создан List экземпляр, и приведение вернет null .

Ответ №3:

Будет ли использование var packageInfo вместо List<PackageInfo> соответствовать вашим потребностям? Ответ @ mtv также может сработать, но я думаю, что использование var лучше для производительности и удобочитаемости

Комментарии:

1. Я узнал об этом, IList когда я выполнял отладку с var объявлением. Спасибо

Ответ №4:

Да. var работает.

На самом деле там был неправильный класс. Это должен быть ApplicationInfo класс.

Таким образом, это либо

 IList<ApplicationInfo> packageInfo = PackageManager
    .GetInstalledApplications(PackageInfoFlags.MetaData);
  

или

 var packageList = PackageManager 
    .GetInstalledApplications(PackageInfoFlags.MetaData);
  

Да, так и должно быть IList . Спасибо.

Комментарии:

1. Если я использую, PackageManager.GetInstalledPackages(PackageInfoFlags.MetaData); тогда это будет IList<PackageInfo> .