欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# Linq延遲查詢的執(zhí)行實例代碼

 更新時間:2021年04月19日 09:23:59   作者:沉默♪☞小傲  
這篇文章主要介紹了C# Linq延遲查詢執(zhí)行的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

C# Linq延遲查詢

在定義linq查詢表達式時,查詢是不會執(zhí)行,查詢會在迭代數(shù)據項時運行。它使用yield return 語句返回謂詞為true的元素。

var names = new List<string> { "Nino", "Alberto", "Juan", "Mike", "Phil" };
var namesWithJ = from n in names
                 where n.StartsWith("J")
                 orderby n
                 select n;
Console.WriteLine("First iteration");
foreach (string name in namesWithJ) 
{
    Console.WriteLine(name);
}
Console.WriteLine();

names.Add("John");
names.Add("Jim");
names.Add("Jack");
names.Add("Denny");

Console.WriteLine("Second iteration");
foreach (string name in namesWithJ)
{
    Console.WriteLine(name);
}

運行結果為

First iteration
Juan

Second iteration
Jack
Jim
John
Juan

從執(zhí)行結果可以看出,當在定義namesWithJ時并不會執(zhí)行,而是在執(zhí)行每個foreach語句時進行,所以后面增加的“John”、“Jim”、“Jack”和“Denny”在第二次迭代時也會參與進來。

ToArray()、ToList()等方法可以改變這個操作,把namesWithJ的定義語句修改為

var namesWithJ = (from n in names
                  where n.StartsWith("J")
                  orderby n
                  select n).ToList();

運行結果為

First iteration
Juan

Second iteration
Juan

在日常工作中,我們常會使用 datas.Where(x=>x.XX == XXX).FirstOrDefault() 和 datas.FirstOrDefault(x=>x.XX == XXX),其實這兩種寫法性能是等效的,如果真的要在性能上分個高低,請見下面

C# Linq.FirstOrDefault、Linq.Where、Linq.AsParallel、List.Exists、List.Find、Dictionar.TryGetValue、HashSet.Contains 性能的比較

今天我們來比較一下集合檢索方法性能更優(yōu)問題,測試代碼

public class Entity
{
    public int Id { get; set; }
    public int No { get; set; }
    public string Col1 { get; set; }
    public string Col2 { get; set; }
    public string Col3 { get; set; }
    public string Col4 { get; set; }
    public string Col5 { get; set; }
    public string Col6 { get; set; }
    public string Col7 { get; set; }
    public string Col8 { get; set; }
    public string Col9 { get; set; }
    public string Col10 { get; set; }
}
static void TestFindVelocity(int totalDataCount, int executeCount)
{
    #region 構造數(shù)據
    List<Entity> datas = new List<Entity>();
    for (int i = 0; i < totalDataCount; i++)
    {
        var item = new Entity
        {
            No = i + 1,
            Col1 = Guid.NewGuid().ToString("N"),
            Col2 = Guid.NewGuid().ToString("N"),
            Col3 = Guid.NewGuid().ToString("N"),
            Col4 = Guid.NewGuid().ToString("N"),
            Col5 = Guid.NewGuid().ToString("N"),
            Col6 = Guid.NewGuid().ToString("N"),
            Col7 = Guid.NewGuid().ToString("N"),
            Col8 = Guid.NewGuid().ToString("N"),
            Col9 = Guid.NewGuid().ToString("N"),
            Col10 = Guid.NewGuid().ToString("N"),
        };
        datas.Add(item);
    }
    #endregion
    var dicDatas = datas.ToDictionary(x => x.No);
    var hashSetDatas = datas.ConvertAll<Tuple<int, int>>(x => new Tuple<int, int>(x.No, x.No + 1000)).ToHashSet();
    Stopwatch sw = new Stopwatch();
    Random random = new Random();
    Entity searchResult = null;
    bool searchResultBool = false;
    // 每次查詢索引
    List<int> indexs = Enumerable.Range(1, executeCount).Select(x => random.Next(1, totalDataCount)).ToList();

    sw.Start();
    for (int i = 0; i < executeCount; i++)
    {
        searchResult = datas.FirstOrDefault(x => x.No == indexs[i]);
    }
    sw.Stop();
    Console.WriteLine($"list FirstOrDefault 耗時:{sw.ElapsedMilliseconds}");

    sw.Restart();
    for (int i = 0; i < executeCount; i++)
    {
        searchResult = datas.Where(x => x.No == indexs[i]).First();
    }
    sw.Stop();
    Console.WriteLine($"list Where+First 耗時:{sw.ElapsedMilliseconds}");

    sw.Restart();
    for (int i = 0; i < executeCount; i++)
    {
        searchResultBool = datas.Exists(x => x.No == indexs[i]);
    }
    sw.Stop();
    Console.WriteLine($"list Exist 耗時:{sw.ElapsedMilliseconds}");

    sw.Restart();
    for (int i = 0; i < executeCount; i++)
    {
        searchResult = datas.Find(x => x.No == indexs[i]);
    }
    sw.Stop();
    Console.WriteLine($"list Find 耗時:{sw.ElapsedMilliseconds}");

    sw.Restart();
    for (int i = 0; i < executeCount; i++)
    {
        dicDatas.TryGetValue(indexs[i], out searchResult);
    }
    sw.Stop();
    Console.WriteLine($"dictionary TryGetValue 耗時:{sw.ElapsedMilliseconds}");

    sw.Restart();
    for (int i = 0; i < executeCount; i++)
    {
        searchResultBool = hashSetDatas.Contains(new Tuple<int, int>(indexs[i], indexs[i] + 1000));
    }
    sw.Stop();
    Console.WriteLine($"Hashset contains 耗時:{sw.ElapsedMilliseconds}");
}

結果

(集合數(shù)量,測試次數(shù)) Linq.FirstOrDefault Linq.Where+First List.Exists List.Find Dictionary.TryGetValue HashSet.Contains

(100, 5000000)

4544 3521 1992 1872 66 924

(1000, 5000000)

41751 29417 20631 19490 70 869

(10000, 5000000)

466918 397425 276409 281647 85 946

(50000, 5000)

6292 4602 4252 3559 0 2

(500000, 5000)

56988 55568 48423 48395 1 5

應避免錯誤寫法是 datas.Where(x=>x.XX == XXX).ToList()[0] 。

總結

到此這篇關于C# Linq延遲查詢的執(zhí)行的文章就介紹到這了,更多相關C# Linq延遲查詢內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 簡單聊聊c# 事件

    簡單聊聊c# 事件

    這篇文章主要介紹了c# 事件的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • C#面向對象之模擬實現(xiàn)商城購物功能

    C#面向對象之模擬實現(xiàn)商城購物功能

    這篇文章主要為大家詳細介紹了C#面向對象之模擬實現(xiàn)商城購物功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 利用C#自定義一個時間類型YearMonth

    利用C#自定義一個時間類型YearMonth

    .Net6中加入了兩個新的時間類型:DateOnly和TimeOnly,但DateOnly和TimeOnly都有相應的應用場景,所以本文就來自定義一個時間類型YearMonth,用于解決實際項目開發(fā)中的需求,希望對大家有所幫助
    2023-07-07
  • 基于C#實現(xiàn)串口通信

    基于C#實現(xiàn)串口通信

    這篇文章主要為大家詳細介紹了基于C#實現(xiàn)串口通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Unity實現(xiàn)主角移動與攝像機跟隨

    Unity實現(xiàn)主角移動與攝像機跟隨

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)主角移動與攝像機跟隨,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • unity 如何獲取Text組件里text內容的長度

    unity 如何獲取Text組件里text內容的長度

    這篇文章主要介紹了unity 獲取Text組件里text內容的長度操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#判斷一個字符串是否包含另一個字符串的方法

    C#判斷一個字符串是否包含另一個字符串的方法

    這篇文章主要介紹了C#判斷一個字符串是否包含另一個字符串的方法,涉及C#中IndexOf方法的使用技巧,非常簡單實用,需要的朋友可以參考下
    2015-04-04
  • C#基礎語法:Base關鍵字學習筆記

    C#基礎語法:Base關鍵字學習筆記

    這篇文章主要介紹了C#基礎語法:Base關鍵字學習筆記,本文講解了它的一些基礎知識以及測試代碼,需要的朋友可以參考下
    2015-06-06
  • C#語音識別用法實例

    C#語音識別用法實例

    這篇文章主要介紹了C#語音識別用法,實例分析了C#利用微軟操作系統(tǒng)自動的語音識別功能,讀取信息的技巧,需要的朋友可以參考下
    2015-01-01
  • C#操作XML通用方法匯總

    C#操作XML通用方法匯總

    這篇文章主要為大家詳細介紹了C#操作XML通用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10

最新評論