Как я могу преобразовать анонимный тип в сильный тип в LINQ?

Мне удалось это исправить, отредактировав значение compileSDK. Я изменил его с 27 на 28.

18
задан Russ 29 April 2009 в 14:24
поделиться

3 ответа

Я вижу, что никто не обратил внимания на вашу необходимость явного преобразования анонимного типа в именованный тип, так что здесь ... Используя " 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, вы можете сделать это:

18
ответ дан 30 November 2019 в 08:38
поделиться

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.

3
ответ дан 30 November 2019 в 08:38
поделиться

Как сказал Марк Гравелл, вы не должны получать доступ к свойству Tag из разных потоков и приведению Это довольно дешево, поэтому у вас есть:

var items = (e.Argument as ListViewItem[]).Select(x=>x.Tag)
         .OfType<SalesOrderMaster>().ToList();

, но затем вы хотите найти отдельные элементы - здесь вы можете попробовать использовать AsParallel :

var orders = items.AsParallel().Distinct();
3
ответ дан 30 November 2019 в 08:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: