results.Where(x=>x.Members.Any(y=>members.Contains(y.Name.ToLower())
我碰巧在互联网上看到了这个查询。任何人都可以解释这个问题。
建议我为这个新手提供一个很好的LINQ教程。
谢谢大家。
编辑:
x和y代表什么?
答案 0 :(得分:3)
x
是results
序列中元素类型的单个结果。y
是x.Members
序列中元素类型的单个成员。这些是使用C#3引入语言的lambda表达式(x => x.whatever
),其中x
是输入,右侧(x.whatever
)是输出(in这种特殊的使用场景)。
更简单的例子
var list = new List<int> { 1, 2, 3 };
var oddNumbers = list.Where(i => i % 2 != 0);
此处,i
是单个int
项,它是表达式的输入。 i % 2 != 0
是一个布尔表达式,用于评估输入是偶数还是奇数。整个表达式(i => i % 2 != 0
)是一个谓词,Func<int, bool>
,其中输入是一个整数,输出是一个布尔值。跟随?当您遍历查询oddNumbers
时,list
序列中的每个元素都将根据谓词进行评估。那些通过的东西成为你输出的一部分。
foreach (var item in oddNumbers)
Console.WriteLine(item);
// writes 1, 3
答案 1 :(得分:1)
它是lambda expression。 Here是一个很棒的LINQ教程
答案 2 :(得分:1)
有趣的查询,但我不喜欢它。
我先回答你的第二个问题。 x
和y
是在Where()
和Any()
调用中定义的lambda方法的参数。您可以轻松更改名称以使其更有意义:
results.Where(result =>
result.Members.Any(member => members.Contains(member.Name.ToLower());
要回答您的第一个问题,此查询将返回results
中的每个项目,Members
集合中至少有一个项目也包含在Members
集合中案例字符串。
通过了解Members
集合是什么或它拥有什么,我的逻辑对我来说并没有多大意义。
答案 3 :(得分:0)
x将是结果集合的每个实例。该查询使用lambda语法,因此x =&gt; x。 somemember 意味着“在每个传入的x上调用somemember。在哪里是IEnumerables的扩展方法,它需要一个带参数的函数并返回一个boolean.Lambda语法在封面下创建委托,但对于执行某些类型的操作(并节省大量输入)更具表现力。
在不知道结果集合中保存的对象类型(结果将是实现IEnumerable的内容)的情况下,很难确切知道上面的代码将会做什么。但有一个有根据的猜测是,它将检查上述集合中所有x的所有成员,并返回一个IEnumerable,只有那些具有所有小写名称的成员。