[英]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.