2016-01-21 3 views
2

У меня есть запрос, который возвращает список, называемый «результаты». Затем мне нужно отфильтровать этот список, чтобы исключить любые записи, которые имеют подстроку первых двух символов в другом списке.Запрос LINQ для фильтрации на основе подстроки списка

Мои начальные результаты имеют счет 36 и после выполнения следующих фильтруемых результатов также имеет счет 36. Я убедился, что список delayCodes включает значение, которое должно быть найдено по меньшей мере в двух записях, возвращаемых в " результаты ".

var delayCodes = new string[] { "AT", "FA", "FC", "FP", "MI", "MT", "SD" }; 

var filteredResults = results.Select(i => !delayCodes.Contains(i.DLY_CODE.Substring(0,2))); 

Я сделал некоторые поиска, и я вижу, где некоторые предлагают использовать .StartsWith, но они, как правило, смотрят на конкретное значение, как .StartsWith («хх»). Я не знаю, как рассказать запрос, чтобы посмотреть на мой список кодов.

Любые предложения о том, как я могу заставить что-то подобное работать?

ответ

6

Вы должны использовать Where, если вы хотите фильтровать:

var filteredResults = results.Where(i => !delayCodes.Contains(i.DLY_CODE.Substring(0,2))); 

Вот более эффективным (на больших коллекций) подход, который использует LINQ "Left Join":

var filteredResults = 
    from res in results 
    join code in delayCodes 
    on res.DLY_CODE.Substring(0, 2) equals code into gj 
    from lj in gj.DefaultIfEmpty() 
    where lj == null 
    select res; 
+0

Спасибо! Сначала я попробовал. Где не работал, поэтому я попробовал .Select, который тоже не работал. Я проведу ваш предложенный код и дам вам знать, как это работает. – Caverman

+0

Я думаю, что ваш предлагаемый эффективный подход будет работать. Когда я запустил его, результаты пошли от начального отсчета от 38 до 19. Я вернусь и просмотрю результаты, чтобы подтвердить, что все работает, но я уверен, что это так. Я не понимаю все, что делает ваш код, поэтому мне придется больше изучить его. – Caverman

2

Alternativly к решению Tims:

var filteredResults = results.Where(i => delayCodes.All(x => x != i.DLY_CODE.Substring(0,2))); 
+0

Я пробовал этот, но исходные результаты и отфильтрованные результаты возвращались с одинаковым подсчетом. Мне нужно взглянуть на данные, чтобы проверить некоторые вещи. Вопрос, хотя, я думал, что прочитал, что использование .ALL найдет первое условие, которое было встречено, а затем проигнорирует остальное. Пример: если 5 записей начались с «SD», как только он найдет первый, он проигнорирует остальные. Итак, вместо исключения всех 5 это исключало бы только 1? – Caverman

+0

Нет, на самом деле он проверяет, проходят ли все члены коллекции условие. Он останавливается, когда найден первый элемент, который НЕ передает условие. Поэтому для каждого элемента witihin 'result' он проверяет, есть ли там ВСЕ элементы в' delayCodes', отличные от прежних. – HimBromBeere

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