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 지연 조회 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SQL은 잊어버리고 내 친구들은 모두 LINQ를 사용합니다.Learning SQL is a pain. Using SQL is a pain. Choose .NET. Choose LINQPad. 작년 초에 저는 을 구축하고 있었고 한동안 들어가려고 했지만 (또는 지금은 EF C...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.