今天突然好奇當linq進行循環遍歷的時候,如果滿足條件的時候還會不會繼續循環剩余的數據,做了個小實驗。
首先看看上代碼
這個是測試的類首先看看直接使用linq遍歷list是什麼樣的。 代碼如下:
public class TestLinq { int _Number; public int Number { get { Console.WriteLine("讀取Number" + _Number);//這裡是為了測試看看是否讀取了number值 return _Number; } set { _Number = value; } } }
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代碼是不會執行的
繼續看代碼:
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讀取了所有的數據,加了一句ToList後linq確確實實的執行了如果我換成了ToArray效果也和ToList()一樣,如果我只想取一條數據,那麼linq會遍歷所有的麼,繼續看
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執行,那麼skip和take呢,繼續試。
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(); } }
效果圖
發現也是沒有執行
下面我們在看其他方法,比如 AsQueryable()和AsEnumerable()方法
效果也是一樣
新人第一次寫博客,深知新人的迷惑,下一篇我們看看EF操作數據庫是不是真的如傳說中的那麼爛。
新人的QQ群165609857