2014-12-28 2 views
1

Я использую следующий код, чтобы отфильтровать список, содержащий строку pre. Что мне не хватает? Вот кодLinq не работает

string pre = "a"; 
List<string> A = new List<string>(); 
List<string> B = new List<string>(); 
DAL dal = new DAL(); 
A = dal.GetNames(); 
B = (from x in A 
    where A.Contains(pre) 
    select x).ToList(); 
B = A.Where(c => A.Contains(pre)).ToList(); 

B всегда приходит пустой здесь (в обоих случаях).

ответ

2

Ваш код не работает, как ожидается, по двум причинам.

  1. Это звучит, как вы хотите, чтобы соответствовать любой подстроке каждого элемента списка на основе ваших критериев поиска (переменная pre), но вы ищете в настоящее время для точного совпадения по каждой записи. Следовательно, ваш текущий код ничего не возвращает, потому что в списке A нет строки, которая является просто «а».
  2. Ваши лямбда-выражения, вероятно, неверны, поскольку они относятся ко всему экземпляру A, а не к текущей записи A.

Чтобы исправить 1) вместо Contains, используйте IndexOf оценить каждую строку в списке, поэтому точное совпадение не требуется, он просто выглядит для любого матча критериев поиска, в любом месте в каждой строке в список.

Чтобы исправить 2), поймите, что в выражении лямбда переменная слева имеет значение текущее значение, которое повторяется. Поэтому дается список x из 1,2,3,4,5, если мое выражение равно n => n > 2, это означает, что в итерации это выражение оценивается 5 раз, а n - это 1, 2, 3, 4 или 5. On каждое из этих чисел, выражение равно n> 2?, что приводит к истинному или ложному значению для каждой записи в списке. В вашем коде вы не используете переменную, ссылающуюся на текущий элемент списка, который повторяется в выражении, поэтому оценка не имеет ничего общего с текущей записью - все оценки возвратят тот же результат, например, если я изменил исходный текст выражение для n => 2 > 1, все элементы в списке оцениваются в true для этого выражения.

Исправление это просто, как показано в других ответах - в вашем выражении используйте переменную в левой части выражения лямбда вместо обращения к списку, находящемуся вне другой области.

string pre = "a"; 
List<string> A = new List<string>(); 
List<string> B = new List<string>(); 

A = new List<string>() { "a", "ba", "bb", "bc" }; 

B = (from x in A 
     where x.IndexOf(pre) > -1 
     select x).ToList(); 

B = A.Where(c => c.IndexOf(pre) > -1).ToList(); 
6

Я предполагаю, что вы хотите найти все элементы в списке, который содержит слово pre? В этом случае следует изменить следующим образом:

B = (from x in A 
    where A.Contains(pre) 
    select x).ToList(); 

в

B = (from x in A 
    where x.Contains(pre) 
    select x).ToList(); 

Ваш запрос Linq возвращают только непустой результат, когда есть точное соответствие предварительно в списке

0

Изменить ваш запрос на это:

  1. где часть отличается
  2. без учета регистра поиск

    B = (from x in A 
         where x.IndexOf(pre, StringComparison.CurrentCultureIgnoreCase) != -1 
         select x).ToList();