2016-05-11 2 views
2

Я пытается ускорить следующий LINQ запрос объекта:Ускорение LINQ Объект запроса

var setOfCodes = codeList1 
    .SelectMany(q => q.Codes) 
    .Union(codeList2.SelectMany(q => q.Codes) 
    .Union(codeList3.SelectMany(q => q.Codes) 
    .ToList(); 

Где

codeListX is a List<Item> 

и

public Item { 
    public List<int> Codes = new List<int>(); 
} 

Пример:

var codeList1 = new List<Item> { 
    new Item { 
     Codes = new List<int> { 
      100, 
      105, 
      110 
     } 
    }, 
    new Item { 
     Codes = new List<int> { 
      100, 
      110, 
      115 
     } 
    }, 
}; 
var codeList2 = new List<Item> { 
    new Item { 
     Codes = new List<int> { 
      150, 
      155, 
      160 
     } 
    }, 
    new Item { 
     Codes = new List<int> { 
      150, 
      155, 
      170 
     } 
    }, 
}; 

И вывод должен быть (не хлопотал о порядке, я могу сортировать позже):

100, 105, 110, 115, 150, 155, 160, 170 

IE: выводит список, содержащий все коды, которые появляются в пределах codeListX годов.

Есть ли более быстрый способ сделать это?

+1

Две точки ... один, это было бы очень хорошо, если бы вы по крайней мере, после компилируемый код, задавая вопрос. Это гораздо более внимательно. Во-вторых, что заставляет вас думать, что это медленно? Вы его профилировали? Что было бы так быстро? –

+0

@DavidL Извините, код здесь - упрощенная версия того, что я на самом деле использую. Что касается того, почему он медленный, эти 'codeListsX', когда сплющены, содержат ~ 10-100 кодов в день в диапазоне дат. По мере того, как диапазон дат увеличивается, время, в течение которого этот код возвращается, увеличивается. Я искал ускорение этого. Для справки, около 500 кодов занимает 1 секунду в моей системе dev, чтобы создать уникальный список. – JosephGarrone

+3

Упрощенный в порядке. Невозможно скомпрометировать не :). Настоящим виновником здесь является союз. Избегая этого, как и в ответе Xiaoy ниже, намного эффективнее, поскольку вам больше не нужно производить продукт из все большего числа наборов. –

ответ

4

Вы можете написать это:

var setOfCodes = new[] { codeList1, codeList2, codeList3 } 
    .SelectMany(x => x) 
    .SelectMany(x => x.Codes) 
    .Distinct() 
    .ToList(); 
+0

Черт, не понял, что это будет намного быстрее. Для справки, мой метод давал мне 1200 мс для этого, тогда как этот метод давал мне 100 мс. – JosephGarrone

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