从列表中获取结果列表

时间:2017-09-02 08:30:32

标签: c# linq

我有像

这样的结构
class a
{
 public IList<b> bs{ get; set; }
        public class b
        {
            public string r{ get; set; }
            public IList<sl> sls{ get; set; }
            public class sl
            {
                public string sn{ get; set; }
                public string st{ get; set; }
            }
        }
}

查询就像是sn == "abc"然后得到r 我做完了

 a aobj = new a();
 var aa = aobj.bs.Where(c => c.sl != null).Select(c => c).ToList(); // here I get `r = "qwerty", sls will have data like sn = "qwerty0", st= "1" ; sn = "asdf" , st="2"; sn = "zxc" st = "abc"; sn="me" , st = "abc"
 var bb = aa.where(c => c.sl.Select(dr => dr.st.ToLower().Contains("abc"))); // I 'm here checking that `sn` contain abc or not
 var cc = bb.Select(c => c.r).ToList(); // result

我的预期查询输出是“zxc”,“我”

但我得到的所有列表不仅包含abc ..任何人都可以建议我该怎么办?我正在将此查询分区为debug。 谢谢

2 个答案:

答案 0 :(得分:1)

您需要使用Any运算符来检查可枚举集合是否包含符合条件的项目。

您不能使用Select因为它只投影项目,它不返回谓词,因此在where子句中没有任何功能。

这是您的(修复了语法错误)更改的代码:

var aa = aobj.bs.Where(c => c.sls != null).Select(c => c).ToList();
// use Any here
var bb = aa.Where(c => c.sls.Any(dr => dr.sn.ToLower().Contains("abc")));
var cc = bb.Select(c => c.r).ToList();

这是我使用的测试集:

a aobj = new a();
aobj.bs = new List<b>();
aobj.bs.Add(new b {
  r ="bar",
  sls = new List<sl>{
    new sl { sn="tets"},
    new sl { sn="no"}
  }
});

aobj.bs.Add(new b {
  r ="foo",
  sls = new List<sl>{
    new sl { sn="no"},
    new sl { sn="abc"}
  }
});

aobj.bs.Add(new b {
  r ="fubar",
  sls = new List<sl>{
    new sl { sn="no"},
    new sl { sn="abc"}
  }
});

这将输出:

  

FOO
    FUBAR

如果将所有操作符组合在一起,您将获得:

var merged = aobj
   .bs
   .Where(c => c.sls != null 
      &&  c.sls.Any(dr => dr.sn.ToLower().Contains("abc")))
   .Select(c => c.r);

答案 1 :(得分:0)

我认为你可以使用这样的代码:

var cc = a.bs
    .Where(w => w.sls?.Any(s => s.st?.ToLower().Contains("abc") ?? false) ?? false)
    .Select(c => c.r);