阅读Microsoft here
的示例后 var query = from Student student in arrList
where student.Scores[0] > 95
select student;
foreach (Student s in query)
Console.WriteLine(s.LastName + ": " + s.Scores[0]);
我有一个问题:
是否可以避免循环?
foreach (Student s in query)
Console.WriteLine(s.LastName + ": " + s.Scores[0]);
如果我重写查询并假设我的查询将始终返回一个结果。
var query = from Student student in arrList
where student.FirstName == "Cesar"
select student;
我不需要循环...我知道我的查询只返回一个元素。
答案 0 :(得分:4)
它仍然是IEnumerable
,但有一个项目。如果您想要提取它,可以使用First()甚至更好Single():
var query = from Student student in arrList
where student.FirstName == "Cesar"
select student;
var student = query.Single();
此外,您可以使用where
重载方法替换整个Single/First
子句:
var emperor = arrList.Single(s => s.FirstName == "Cesar");
Single
比First
更严格,因为它还会检查是否只返回了一件商品。
答案 1 :(得分:3)
FirstOrDefault,我更喜欢方法链语法,例如
arrList.FirstOrDefault(s => s.FirstName == "Cesar");
答案 2 :(得分:0)
var query = from Student student in arrList
where student.FirstName == "Cesar"
select student;
使用此query.First()。LastName
if (query.Count() > 0)
Console.WriteLine(query.First().LastName + ": " + query.First().Scores[0]);
答案 3 :(得分:0)
您可以使用FirstOrDefault()方法。
这是你的查询,重写......
var student = (from Student student in arrList
where student.FirstName == "Cesar"
select student).FirstOrDefault();
您的查询也可以编写,链接方法。在我看来,眼睛更容易......
arrList.Where(student => student.FirstName == "Cesar").FirstOrDefault();
甚至更浓缩......
arrList.FirstOrDefault(student => student.FirstName == "Cesar");
答案 4 :(得分:0)
如果你知道只返回1个记录/对象,你绝对可以避免调用循环。
查看.First()
,.FirstOrDefault()
,.Single()
,SingleOrDefault()
扩展方法。
答案 5 :(得分:0)
以lambda方式
arrList.SingleOrDefault(q => q.Scores[0] > 95);
答案 6 :(得分:0)
对于问题的第2部分,您可以显式返回单个Student对象:
var student = (from Student s in arrList where s.FirstName == "Cesar" select student).FirstOrDefault();
答案 7 :(得分:0)
查询将是IEnumerable<Student>
。
IEnumerable<T>
本身没有允许您对每个枚举T
执行操作的扩展方法,例如List<T>
对ForEach<T>(Action<T>)
执行操作。你当然可以编写扩展方法来做到这一点,我相信很多人都有,但这是一个设计决定没有它( an article by Eric Lippert that discusses this )。
如果您知道您的表达式将始终返回一个结果,那么您可以在预计的集合上调用.First()
(假设您知道总会有至少一个结果)。
var query = (from Student student in arrList
where student.Scores[0] > 95
select student).First();
Console.WriteLine(query.LastName + ": " + query.Scores[0]);
答案 8 :(得分:0)
假设只返回一个结果可能会很危险。不止一个学生的成绩超过95分?
您可以使用lambda表达式来压缩代码:
arrList.ForEach(s => Console.WriteLine(s.LastName + ": " + s.Scores.First());