C# 查詢大型數(shù)據(jù)集
LINQ語(yǔ)法非常好,但其作用是什么?我們只要査看源數(shù)組,就可以看出需要的結(jié)果,為什么要査詢這種一眼就能看出結(jié)果的數(shù)據(jù)源呢?如前所述,有時(shí)查詢的結(jié)果不那么明顯。在下例中,就創(chuàng)建了一個(gè)非常大的數(shù)字?jǐn)?shù)組,并用LINQ查詢它。
試一試 查詢大型數(shù)據(jù)集:BeginningCSharp7 _22_6_LargeNumberQuery\Program.cs
按照下面的步驟在Visual Studio 2017中創(chuàng)建示例。
(1)在 C:\BeginningCShaip7\Chaptei22目錄中創(chuàng)建一個(gè)新的控制臺(tái)應(yīng)用程序 BeginningCShaip7_22_6_ LargeNumbeiQuery。與以前一樣,創(chuàng)建項(xiàng)目時(shí),Visual Studio 2017會(huì)自動(dòng)在Program.cs中包含Linq名稱空間。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using static System,Console;
(2)在Main()方法中添加如下代碼:
static void Main (string[] args)
{
int[] numbers = GenerateLotsOfNuntbers(12045678);
var queryResults =
from n in nunibers
where n < 1000
select n
;
WriteLine("Numbers less tiian 1000:"};
foreach (var item in queryResults)
{
WriteLine(xtero);
}
Write("Program finished, press Enter/Return to continue:");
ReadLine();
}
(3)添加如下方法,生成一個(gè)隨機(jī)數(shù)列表:
private static int[] GenerateLotsOfNumbers(int count)
{
Random generator = new Random(0);
int[] result = new int[count];
for (int i = 0; i < count; i++)
{
result[i] = generator.Next();
}
return result;
}
(4)編譯并執(zhí)行程序。結(jié)果是一個(gè)小于1000的數(shù)字列表,如下所示:
Numbers less than 1000:
714
24
677
350
257
719
584
Program finished, press Enter/Return to continue:
示例說(shuō)明
與前面一樣,第一步是引用System.Linq名稱空間,這是在創(chuàng)建項(xiàng)目時(shí)由Visual Studio 2017自動(dòng)引用的:
using System.Linq;
接著創(chuàng)建一些數(shù)據(jù),為此,本例中創(chuàng)建并調(diào)用了 GenerateLotsOfNurabers()方法:
int[] numbers = GenerateLotsOfNumbers(12345678);
private static int[] GenerateLotsOfNumbers(int count)
{
Random generator = new Random(0);
int[] result = new int[count];
for (int i = 0; i < count; i++)
{
result[i] = generator.Next();
}
return result;
}
這不是一個(gè)小數(shù)據(jù)集,數(shù)組中有1200萬(wàn)個(gè)數(shù)字!需要修改傳遞給 GenerateLotsOfNumbers()方法的size參數(shù),生成數(shù)量不同的隨機(jī)數(shù),看看這會(huì)對(duì)查詢結(jié)果有什么影響。
數(shù)值應(yīng)隨機(jī)分布在有符號(hào)的整數(shù)范圍內(nèi)(從0到超過20億)。用種子值0創(chuàng)建隨機(jī)數(shù)生成器,可以確保每次創(chuàng)建相同的隨機(jī)數(shù)集合,這是可以重復(fù)的,所以會(huì)獲得與此處相同的查詢結(jié)果,但在嘗試一些查詢之前,并不知道查詢結(jié)果是什么。而LINQ使這些查詢很容易編寫。
查詢語(yǔ)句本身類似于前面用于names數(shù)組的查詢,也是選擇某些滿足條件的數(shù)字(這里是數(shù)字小于1000):
var queryResults =
from n in numbers
where n < 1000
select n
這次不需要wderby子句,但處理時(shí)間稍長(zhǎng)(對(duì)于這個(gè)查詢,處理時(shí)間的變化不太明顯,但下一個(gè)示例會(huì)改變選擇條件,處理時(shí)間的變化就比較明顯了)。
用foreach語(yǔ)句輸出查詢的結(jié)果,與前面的示例相同:
WriteLine("Numbers less than 1000:"};
foreach (var item in queryResults) {
WriteLine(item);
}
同樣,將結(jié)果輸出到控制臺(tái)上,并讀取一個(gè)字符以暫停輸出:
Write("Program finished, press Enter/Return to continue:");
ReadLine();
后面所有的示例都有暫停代碼,但不再列出,因?yàn)槊總€(gè)示例的暫停代碼都相同使用LINQ,可以很容易地修改查詢條件,以便演示數(shù)據(jù)集的不同特性。但是,根據(jù)查詢返回的結(jié)果數(shù),每次都輸出所有的結(jié)果是沒有意義的。
點(diǎn)擊加載更多評(píng)論>>