임의 접근 (random access) : 순서에 관계 없이 사용할 수 있다. 갑자기 마지막 데이터를 달라고 요청할 수 있습니다.
순차 접근 (sequential access) : 앞에서부터 차례대로 사용한다. 갑자기 마지막 데이터를 꺼내서 사용할 수 없다. 처음부터 순서대로 나열됩니다.
배열은 임의 접근이 가능합니다.
IEnumerable(열거 인터페이스)는 임의 접근 하지 않습니다. 순차 접근만 가능합니다.
ElementAt(), ElementAtDefault() 메서드를 사용하면 인덱스 번호를 지정하여 임의 접근할 수 있는것 처럼 보일 수 있지만, 그것은 착각이다.
1.1 사용 예제
예제에서 처리시간만 두고 비교하면 배열의 처리 시간이 더 빠릅니다.
임의 접근을 해야 할 때는 배열을 사용하는게 유리합니다.
static void Main(string[] args)
{
int size = 1000000;
int count = 100000000;
var ar = new int[size];
ar[size - 1] = 999;
var start1 = DateTime.Now;
for (int i = 0; i < count; i++)
{
var n = ar.ElementAtOrDefault(size - 1);
}
Console.WriteLine(DateTime.Now - start1);
var start2 = DateTime.Now;
for (int i = 0; i < count; i++)
{
var n = ar[size -1];
}
Console.WriteLine(DateTime.Now - start2);
Console.ReadKey();
}
1.2 실행결과
2. 자유도와 필요도
배열은 열거 인터페이스보다 빠릅니다.
하지만, 배열을 만드는 시간도 고려해야합니다.
2.1 사용예제
열거 인터페이스를 사용하면 배열의 요소를 나열하는 작업을 중간에 멈출 수 있습니다.
열거 인터페이스를 사용해서 첫 번째 요소를 가져오고, 처리를 멈춥니다.
두 번째 요소는 가져오지 않습니다.
다만, 두 번째 요소를 가져올 때는 순차 접근을 하기 때문에 ToArray()사용 할 때와 처리 시간이 비슷할 수 있습니다.
ToArray()는 배열을 생성합니다.
배열은 데이터가 전부 존재해야 합니다.
열거 객체를 사용하지만 ToArray()가 모든 요소를 만들고, 시간이 더 오래걸리는 것입니다.
class Program
{
private static IEnumerable<int> enumSample()
{
yield return 1;
Task.Delay(1000).Wait();
yield return 2;
}
static void Main(string[] args)
{
var start1 = DateTime.Now;
var q = enumSample();
var r1 = q.First();
Console.WriteLine(DateTime.Now - start1);
var start2 = DateTime.Now;
var ar = enumSample().ToArray();
var r2 = ar.First();
Console.WriteLine(DateTime.Now - start2);
Console.ReadKey();
}
}