2017-01-05 2 views
5

Новое для LINQ и не уверен в правильном синтаксисе того, что я хочу сделать.C# LINQ выберите, где значение не содержится в массиве/списке

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

в настоящее время ...

var keys = (from s in context.Keys 
      where s.Code != "BadCode1" 
      where s.Code != "BadCode2" 
      where s.Code != "BadCode3" 
      where s.Code != "BadCode4" 
      where s.Code != "BadCode5" 
      orderby s.Name 
      select s).ToList<Keys>(); 

Как бы я обрезал его до одной строки и прочитал ли он из «черного списка»? так больше нравится ...

var keys = (from s in context.Keys 
      where s.Code != ANY OF THE VALUES FROM "BLACKLIST" 
      orderby s.Name 
      select s).ToList<Keys>(); 

ответ

2

Создать List<string> со всеми недопустимыми значениями

List<string> sBlackList = new List<string>(){"BadCode1", "BadCode2", "BadCode3"}; 

и заменить

where s.Code != ANY OF THE VALUES FROM "BLACKLIST" 

с

where !sBlackList.Contains(s.Code) 
1

Вы могли бы список кодов черного списка и проверить, если он не содержит соответствующие коды

var keys = (from s in context.Keys 
      where !blackList.Contains(s.Code) 
      orderby s.Name 
      select s).ToList<Keys>(); 
-1

Попробуйте поставить все badcodes в HashSet, и искать значения не в «черном списке-hashest»

+3

Как правило, рекомендуется предоставить пример кода :) –

5

Добавить его массив, а затем использовать Contains:

var badCodes = new[] { "BadCode1", "BadCode2", "BadCode3", "BadCode4", "BadCode5"}; 

var keys = (from s in context.Keys 
      where !badCodes.Contains(s.Code) 
      orderby s.Name 
      select s).ToList<Keys>(); 
4
var keys = (from s in context.Keys 
    where !blackList.Contains(s.Code) 
    orderby s.Name 
    select s).ToList(); // do you really need the ToList? 

массив или список (может быть)

Если вы делаете это в памяти (linq to objects), то HashSet будет работать лучше, чем массив или список. Если вы делаете это в базе данных, это не будет иметь никакого значения.

Кроме того, вам действительно нужно, чтобы он был в списке? Если вы собираетесь просмотреть результаты или иначе сделать что-то, для чего IEnumerable<> или IQueryable<> будет служить самостоятельно, вам, вероятно, лучше не нужно его покидать.

1

Вы также можете использовать Except Method похожее на это:

var badCodes = new[] { "BadCode1", "BadCode2", "BadCode3", "BadCode4", "BadCode5"}; 

var blackList = context.Keys.Where(s => badCodes.Contains(s.Code)); 
var filteredKeys = context.Keys.Except(blackList); 
+0

Для этого требуется 2 запроса к базе данных. Как насчет подхода _RandomStranger_? – fubo

+0

true, просто хотел указать метод «Исключить» :) –

1

Все остальные правильные ответы, но я лично фанат этого:

Если предположить, что у вас есть список строк с именем blackList, содержащий все строки, которые вы хотите отфильтровать.

var keys = context.Keys.Where(x => !blackList.Contains(x.Code)) 
    .OrderBy(x => x.Name) 
    .ToList(); 

Мне просто нравится, как это делает мой код понятным и понятным. Но опять же, каждый ответ правильный.

1

Для обнаружения пересечения любых коллекций вы можете использовать метод .Contains(). Его просто:

1) определяют вас BLACKLIST:

var blackList = new List<string> {"BadCode1", 
            "BadCode2", 
            "BadCode3", 
            "BadCode4", 
            "BadCode5"}; 

2) фильтровать запрос на пересечении с BLACKLIST (blackList.Contains (s.Code)):

var keys = (from s in context.Keys 
      where !blackList.Contains(s.Code) 
      orderby s.Name 
      select s).ToList<Keys>(); 
Смежные вопросы