如预期的原因有两个,您的代码不起作用。
- 这听起来像你想匹配基于您的搜索条件(变量
pre
)各列表项的任意子串,但你对每个条目的精确匹配当前搜寻。因此,您当前的代码不会返回任何内容,因为列表A
不包含任何仅为“a”的字符串。
- 您的lambda表达式可能是错误的,因为它们引用的是
A
的整个实例,而不是当前正在评估的A
条目。
要解决1),而不是Contains
,使用IndexOf
列表来评估每个字符串,因此精确匹配不是必需的,它只是看起来的搜索条件匹配的任何,在每个字符串的任何地方名单。
要修正2),请理解在lambda表达式中,左侧的变量指的是正在迭代的当前的项目。所以给出一个列表x
1,2,3,4,5,如果我的表达式是n => n > 2
,那意味着在迭代中这个表达式被评估5次,并且n
是1,2,3,4或5. On这些数字中的每一个,表达式都是n> 2?被评估,导致列表中每个条目的值为真或假。在你的代码中,你没有使用引用当前正在表达式中迭代的列表项的变量,因此评估与当前条目无关 - 所有评估都将返回相同的结果,例如,如果我更改了原始条目表达式为n => 2 > 1
,则该表达式中的所有项目评估为true
。
解决此问题很简单,如其他答案所示 - 在您的表达式中,使用lambda表达式左侧的变量而不是引用其他范围之外的列表。
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();