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