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

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

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

C# Linq延遲查詢

在定義linq查詢表達式時,查詢是不會執(zhí)行,查詢會在迭代數(shù)據(jù)項時運行。它使用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);
}

運行結(jié)果為

First iteration
Juan

Second iteration
Jack
Jim
John
Juan

從執(zhí)行結(jié)果可以看出,當(dāng)在定義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();

運行結(jié)果為

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 構(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 耗時:{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}");
}

結(jié)果

(集合數(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

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

總結(jié)

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

相關(guān)文章

最新評論

深水埗区| 南靖县| 黄梅县| 井陉县| 依兰县| 贺兰县| 泌阳县| 阿克| 体育| 潜山县| 偏关县| 睢宁县| 炎陵县| 洛宁县| 五大连池市| 德庆县| 河北省| 石景山区| 徐水县| 双鸭山市| 勃利县| 盱眙县| 马尔康县| 唐山市| 宜君县| 伊宁市| 虹口区| 荣成市| 鄂尔多斯市| 灯塔市| 新和县| 宜州市| 房山区| 沙河市| 永兴县| 冀州市| 平果县| 台东县| 灵宝市| 大足县| 辽宁省|