C\#Linq 지연 조회 의 실행 인 스 턴 스 코드

C\#Linq 지연 조회
링크 조회 표현 식 을 정의 할 때 조 회 는 실행 되 지 않 습 니 다.조 회 는 데이터 항목 을 교체 할 때 실 행 됩 니 다.이것 은 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
실행 결 과 를 보면 names WithJ 를 정의 할 때 실행 되 지 않 고 각각의 foreach 문 구 를 실행 할 때 진행 되 기 때문에 뒤에 추 가 된'John','Jim','Jack','Denny'도 2 차 교체 시 참여 한다.
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.First OrDefault,Linq.Where,Linq.AsParallel,List.Exists,List.Find,Dictionar.TryGetValue,HashSet.Contains 성능 비교
오늘 우 리 는 집합 검색 방법의 성능 이 더욱 좋 은 문제,테스트 코드 를 비교 해 보 자.

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     
    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}");
}
결실
(집합 수량,테스트 횟수)
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
오 류 를 피해 야 한다.
총결산
C\#Linq 지연 조회 의 실행 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#Linq 지연 조회 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기