簡體   English   中英

關於Linq的問題

[英]Question about Linq

這里閱讀微軟的例子之后

        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;

我不需要執行循環...我知道我的查詢僅返回一個元素。

它仍然是IEnumerable ,但只有一項。 如果要提取它,可以使用First()甚至更好的Single()

var query = from Student student in arrList
            where student.FirstName == "Cesar"
            select student;

var student = query.Single();

您也可以使用Single/First重載方法替換整個where子句:

var emperor = arrList.Single(s => s.FirstName == "Cesar");

Single會比First更嚴格,因為它還會檢查是否確實返回了一項。

FirstOrDefault,我更喜歡方法鏈語法,例如,

arrList.FirstOrDefault(s => s.FirstName == "Cesar");
var query = from Student student in arrList
        where student.FirstName == "Cesar"
        select student;

使用此查詢.First()。LastName

if (query.Count() > 0)
    Console.WriteLine(query.First().LastName + ": " + query.First().Scores[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");

如果您知道只會返回1條記錄/對象,則可以絕對避免調用循環。

看看.First() .FirstOrDefault() .Single()SingleOrDefault()擴展方法。

以lambda方式

 arrList.SingleOrDefault(q => q.Scores[0] > 95);

對於問題的第二部分,您可以顯式返回單個Student對象:

var student = (from Student s in arrList where s.FirstName == "Cesar" select student).FirstOrDefault();

在這種情況下,查詢將是IEnumerable<Student>

IEnumerable<T>本身沒有允許您對每個枚舉的T執行操作的擴展方法,例如List<T>ForEach<T>(Action<T>) 您當然可以編寫擴展方法來做到這一點,並且我相信很多人都有,但是不這樣做是一個設計決定( Eric Lippert的一篇文章對此進行了討論 )。

如果您知道表達式將始終返回一個結果,則可以在投影的集合上調用.First() (假設您知道將始終至少有一個結果)。

var query = (from Student student in arrList
             where student.Scores[0] > 95
             select student).First();

Console.WriteLine(query.LastName + ": " + query.Scores[0]);

假設僅返回一個結果可能很危險。 一個學生的95分以上是什么?

您可以使用lambda表達式來壓縮代碼:

arrList.ForEach(s => Console.WriteLine(s.LastName + ": " + s.Scores.First());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM