最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

C# Linq延遲查詢

在定義linq查詢表達(dá)式時(shí),查詢是不會(huì)執(zhí)行,查詢會(huì)在迭代數(shù)據(jù)項(xiàng)時(shí)運(yùn)行。它使用yield return 語(yǔ)句返回謂詞為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);
}

運(yùn)行結(jié)果為

First iteration
Juan

Second iteration
Jack
Jim
John
Juan

從執(zhí)行結(jié)果可以看出,當(dāng)在定義namesWithJ時(shí)并不會(huì)執(zhí)行,而是在執(zhí)行每個(gè)foreach語(yǔ)句時(shí)進(jìn)行,所以后面增加的“John”、“Jim”、“Jack”和“Denny”在第二次迭代時(shí)也會(huì)參與進(jìn)來(lái)。

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

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

運(yùn)行結(jié)果為

First iteration
Juan

Second iteration
Juan

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

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

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

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 構(gòu)造數(shù)據(jù)
    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 耗時(shí):{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 耗時(shí):{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 耗時(shí):{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 耗時(shí):{sw.ElapsedMilliseconds}");

    sw.Restart();
    for (int i = 0; i < executeCount; i++)
    {
        dicDatas.TryGetValue(indexs[i], out searchResult);
    }
    sw.Stop();
    Console.WriteLine($"dictionary TryGetValue 耗時(shí):{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 耗時(shí):{sw.ElapsedMilliseconds}");
}

結(jié)果

(集合數(shù)量,測(cè)試次數(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

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

總結(jié)

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

相關(guān)文章

最新評(píng)論

邹平县| 自贡市| 枣强县| 佛教| 宜昌市| 遂昌县| 平罗县| 望奎县| 汝南县| 福贡县| 云林县| 阿拉善右旗| 井冈山市| 乐平市| 汕尾市| 犍为县| 滦平县| 澄城县| 桂平市| 邵阳县| 龙井市| 靖江市| 永春县| 确山县| 太仓市| 馆陶县| 通渭县| 象州县| 灯塔市| 察雅县| 南川市| 阿拉尔市| 蕲春县| 阿尔山市| 湘潭县| 固原市| 克什克腾旗| 察雅县| 长汀县| 梧州市| 茂名市|