2014-12-28 117 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不包含任何仅为“a”的字符串。
  2. 您的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(); 
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();