我使用以下代码来过滤包含字符串pre的列表.我错过了什么?这是代码
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();
Run Code Online (Sandbox Code Playgroud)
B总是在这里空(在两种情况下).
我想你想要做的是找到列表中包含单词pre的所有项目?在这种情况下,应该改变这个:
B = (from x in A
where A.Contains(pre)
select x).ToList();
Run Code Online (Sandbox Code Playgroud)
成
B = (from x in A
where x.Contains(pre)
select x).ToList();
Run Code Online (Sandbox Code Playgroud)
只有列表中的pre匹配时,Linq查询才会返回非空结果
您的代码无法按预期运行,原因有两个。
pre)匹配每个列表条目的任何子字符串,但是您当前正在搜索每个条目的完全匹配项。因此,您的当前代码不返回任何内容,因为列表A不包含任何仅是“ a”的字符串。A而不是A被评估的当前条目。要解决1)而不是Contains,请使用IndexOf来评估列表中的每个字符串,因此不需要完全匹配,它只是在列表中每个字符串的任何位置查找搜索条件的任何匹配项。
要修复2),请了解在lambda表达式中,左侧的变量引用要迭代的当前项。因此,给定一个x1,2,3,4,5 的列表,如果我的表达式为n => n > 2,则意味着在迭代中该表达式将被评估5次,并且分别n为1、2、3、4或5。数字,表达式为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();
Run Code Online (Sandbox Code Playgroud)