今天突然好奇當linq進行循環(huán)遍歷的時候,如果滿足條件的時候還會不會繼續(xù)循環(huán)剩余的數(shù)據(jù),做了個小實驗。
首先看看上代碼
這個是測試的類public class TestLinq { int _Number; public int Number { get { Console.WriteLine("讀取Number" + _Number);//這里是為了測試看看是否讀取了number值 return _Number; } set { _Number = value; } } }首先看看直接使用linq遍歷list是什么樣的。代碼如下:
class PRogram { static void Main(string[] args) { List<TestLinq> lstTestLinq = new List<TestLinq>(); for (int i = 0; i < 10; i++) { lstTestLinq.Add(new TestLinq() { Number = i }); } var test = from c in lstTestLinq where c.Number < 8 select c; Console.ReadKey(); } }
效果如下:
沒有看見Console.WriteLine任何值,這樣可以看出如果僅僅是定義了linq代碼,但是沒有去使用的時候,這段linq代碼是不會執(zhí)行的
繼續(xù)看代碼:
class Program { static void Main(string[] args) { List<TestLinq> lstTestLinq = new List<TestLinq>(); for (int i = 0; i < 10; i++) { lstTestLinq.Add(new TestLinq() { Number = i }); } var test = from c in lstTestLinq where c.Number < 8 select c; test.ToList(); Console.ReadKey(); } }
效果圖:
我們看到linq讀取了所有的數(shù)據(jù),加了一句ToList后linq確確實實的執(zhí)行了如果我換成了ToArray效果也和ToList()一樣,如果我只想取一條數(shù)據(jù),那么linq會遍歷所有的么,繼續(xù)看
class Program { static void Main(string[] args) { List<TestLinq> lstTestLinq = new List<TestLinq>(); for (int i = 0; i < 10; i++) { lstTestLinq.Add(new TestLinq() { Number = i }); } var test = from c in lstTestLinq where c.Number < 8 select c; test.First(); Console.ReadKey(); } }
效果如下
下面我們繼First或FirstOrDefault方法會讓linq執(zhí)行,那么skip和take呢,繼續(xù)試。
class Program { static void Main(string[] args) { List<TestLinq> lstTestLinq = new List<TestLinq>(); for (int i = 0; i < 10; i++) { lstTestLinq.Add(new TestLinq() { Number = i }); } var test = from c in lstTestLinq where c.Number < 8 select c; test.Skip(2).Take(1); Console.ReadKey(); } }
效果圖
發(fā)現(xiàn)也是沒有執(zhí)行
下面我們在看其他方法,比如 AsQueryable()和AsEnumerable()方法
效果也是一樣
新人第一次寫博客,深知新人的迷惑,下一篇我們看看EF操作數(shù)據(jù)庫是不是真的如傳說中的那么爛。
新人的QQ群165609857
|
新聞熱點
疑難解答