我有这样的结构:
struct Test
{
string name;
string family;
public Test...
}
在我的代码中我有一个这个结构的列表:
List<Test> testList=new List<Test>();
我有一个像这样的linq表达式:
var list =testList.Select(n=>n.Name);
但是如何通过testList的Family过滤此选择?像这样的东西:
var list=testList.Select(n=>n.Name).Where(f=>f.Family=="");
此Where子句仅适用于选定的名称,这些名称是字符串
的列表任何想法如何做到这一点?
答案 0 :(得分:12)
只需将Where
放在Select
:
var list=testList.Where(f=>f.Family=="").Select(n=>n.Name);
在Linq中,您需要在投影之前应用过滤器(除非过滤器适用于投影的结果而不是原始集合。)
答案 1 :(得分:5)
在使用Where
仅选择一个属性之前,使用Select
进行过滤。这样,您仍然可以获得完整的对象:
testList.Where(t => t.Family == "").Select(t => t.Name)
毕竟,Select
将获取对象,然后只传递你在lambda中返回的任何内容。在这种情况下,您只返回一个字符串,因此您将Test
对象中的所有其他信息丢弃。因此,您要过滤的信息将不再可用。
如果你切换它,你可以过滤测试对象,然后只返回那个字符串。
答案 2 :(得分:1)
通常当我检查这样的空值时,我会使用string.IsNullOrEmpty()
,以防万一。
testList.Where(f=> string.IsNullOrEmpty(f.Family)).Select(n=>n.Name);
答案 3 :(得分:0)
您应该首先应用where
子句,然后select
使用所需的数据:
var list=testList.Where(f=>f.Family=="").Select(n=>n.Name);