Linq包含不起作用

时间:2014-12-28 10:17:21

标签: c# linq

我使用以下代码过滤包含字符串 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();

B总是空着(在这两种情况下)。

3 个答案:

答案 0 :(得分:7)

我想你想要做的是找到包含单词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查询仅在列表中与pre完全匹配时返回非空结果

答案 1 :(得分:3)

由于两个原因,您的代码无法按预期运行。

  1. 听起来您希望根据搜索条件(变量pre)匹配每个列表条目的任何子字符串,但您目前正在搜索每个条目的完全匹配。因此,您的当前代码不返回任何内容,因为列表A不包含任何只是“a”的字符串。
  2. 您的lambda表达式可能不对,因为它们引用了A的整个实例,而不是被评估的A的当前条目。
  3. 要修复1)而不是Contains,请使用IndexOf来评估列表中的每个字符串,因此不需要完全匹配,它只是在任何地方查找搜索条件的任何匹配项在列表中的每个字符串中。

    要修复2),请理解在lambda表达式中,左侧的变量是指迭代的当前项。所以给定1,2,3,4,5的列表x,如果我的表达式是n => n > 2,那意味着在迭代中这个表达式被评估5次,而n要么是在这些数字中的每一个上,表达式是n> 1,2,3,4或5。评估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();
    

答案 2 :(得分:0)

将您的查询更改为:

  1. 其中部分不同
  2. 不区分大小写的搜索

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