关于Linq的问题

时间:2011-03-23 22:06:05

标签: c# linq

阅读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;

我不需要循环...我知道我的查询只返回一个元素。

9 个答案:

答案 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");

SingleFirst更严格,因为它还会检查是否只返回了一件商品。

答案 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());