C#의 Collection에는 여러 함수들이 존재하는데 특정 원소의 위치를 찾는다거나, 정렬하는 기능들이 존재한다.
IndexOf 함수는 특정 값의 인덱스를 찾는데 사용되는 함수로 여러 형태로 오버로딩되어있다.

item은 찾고자 하는 원소의 값을 의미하고 index는 탐색을 시작할 인덱스, count는 탐색을 진행할 범위를 나타낸다. index이기 때문에 '몇번째 부터 탐색 시작'이 아닌 '이 인덱스부터 탐색 시작'한다는 것을 유의해야한다.
또한 인덱스를 탐색한 결과가 없을 경우 -1을 반환한다.
List<int> c1 = new List<int>() { 1, 5, 6, 1, 3, 1, 2, 3, 9 };
Console.WriteLine(c1.IndexOf(1));
Console.WriteLine(c1.IndexOf(1, 4)); // 3? 5? -> 5
Console.WriteLine(c1.IndexOf(1, 1, 2)); // 없으면 -1
값을 탐색하는 IndexOf와 달리 특정 조건을 만족하는 원소를 탐색하는 방법으로, FindIndex 함수가 있다.

FindIndex는 '특정 조건'에 해당하는 매개변수로 Predicate라는 자료형 값을 받는데 Predicate는 delegate중 하나로 매개변수를 하나를 받고 bool값을 반환하는 delegate이다.
미리 정의 되어있는 함수를 넘겨주어도 되고 람다식을 이용해 넘겨줘도 사용할 수 있다. 조건을 만족하는 모든 원소들을 List 형태로 반환하는 FindAll이라는 함수도 존재한다.
public static bool Divide3(int n) { return n % 3 == 0; }
public static void Main(string[] args)
{
List<int> c1 = new List<int>() { 1, 5, 6, 1, 3, 1, 2, 3, 9 };
Console.WriteLine(c1.FindIndex(Divide3));
Console.WriteLine(c1.FindIndex((n) =>
{
return n % 3 == 0;
}));
}
Collection을 정렬할 때, Sort를 사용하는데 기본적으로 정의되어 있는 정렬규칙외에 다른 규칙으로 정렬을 하고 싶은 것을 위해 오버로딩된 함수가 존재한다.

Comparison은 int를 반환하는 delegate로 정의에 적혀있는 설명을 보면 매개변수로 받는 두개의 x/y 변수의 대소비교에 따른 반환값이 적혀 있다.
물론 Comparison에 미리 정의되어 있는 함수를 넘겨줘도 되고 람다식을 넘겨줘도 된다.

IComparer를 받는 Sort는 IComparer를 구현하는 객체를 전달해줘야 한다. IComparer 인터페이스는 해당 객체가 Compare 함수를 정의한다는 것을 의미하는 인터페이스로 반환값은 int이고 두개의 변수에 대한 대소비교 결과는 위의 Comparison과 동일하다.
