Мне удалось это исправить, отредактировав значение compileSDK. Я изменил его с 27 на 28.
Я вижу, что никто не обратил внимания на вашу необходимость явного преобразования анонимного типа в именованный тип, так что здесь ... Используя " select new {}
" вы создание анонимного типа, но вам не нужно. Вы можете написать свой запрос следующим образом:
List<SalesOrderMaster> orders =
(from item in (e.Argument as ListViewItem[]).AsParallel()
select (SalesOrderMaster)item.Tag)
.Distinct()
.ToList();
Обратите внимание, что запрос выбирает (SalesOrderMaster) item.Tag
без new {}
, поэтому он не создает анонимный тип. Также обратите внимание, что я добавил ToList ()
, так как вы хотите List
.
Это решает проблему анонимного типа. Тем не менее, я согласен с Марком и Гуффой, что использование параллельного запроса здесь не лучший вариант. Чтобы использовать HashSet
, как предложил Guffa, вы можете сделать это:
The part in that code that is expensive is calling the Contains
method on the list. As it's an O(n) operation it gets slower the more objects you add to the list.
Just use a HashSet
for the objects instead of a List
. The Contains
method of the HashSet
is an O(1) operation, so your loop will be an O(n) operation instead of an O(n*n) operation.
Как сказал Марк Гравелл, вы не должны получать доступ к свойству Tag
из разных потоков и приведению Это довольно дешево, поэтому у вас есть:
var items = (e.Argument as ListViewItem[]).Select(x=>x.Tag)
.OfType<SalesOrderMaster>().ToList();
, но затем вы хотите найти отдельные элементы - здесь вы можете попробовать использовать AsParallel
:
var orders = items.AsParallel().Distinct();