位置:首頁(yè) > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

C# 查詢大型數(shù)據(jù)集

提問人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-11

    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é)果是沒有意義的。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部