(C#) List

장장·2025년 9월 23일

C샵자료구조

목록 보기
1/6

List

동영상 강의 링크

  • 길이가 변하는 가변 배열
  • 키워드: Add, Insert, Contains, CopyTo, IndexOf, Reverse
  • Count : 리스트 실제요소 갯수, Capacity: 리스트 배열의 총 크기
  • 첫 Capacity 배열크기가 4였다면? 크기가 넘어서서 Add할경우 *2씩 함. (4,8,16,13,64,128...)
  • 시간복잡도는 맨뒤에 데이터 추가시 O(1) , 맨뒤에 데이터 삭제시 O(1), 읽기 O(1)
  • 검색은 모든 배열을 찾아야하므로 O(N)
  • 추가,삭제는 O(N), 중간의 데이터를 삭제할경우 뒤의 데이터를 앞으로 당겨와야해서

코드예제

List<int> myInts = new List<int>();
myInts.Add(1);
myInts.Add(2);
myInts.Add(5);

Console.WriteLine(myInts.Count); //3
Console.WriteLine(myInts.Capacity); //4
myInts.Add(6);
myInts.Add(9);
Console.WriteLine(myInts.Count); //5
Console.WriteLine(myInts.Capacity); //8
Console.WriteLine("--구분선--");

myInts.Remove(1); //제일 첫번째로 발견되는것 제거
//myInts.RemoveAt(1); //1번째 요소 제거
//myInts.Clear(); //리스트 안의 요소 초기화, count가 0이됨 myInts가 null이 되지 않음

Console.WriteLine(myInts.IndexOf(9)); // 3

for (int i = 0; i < myInts.Count; i++)
{
    Console.WriteLine(myInts[i]); //for문으로 전체 접근
}

Console.WriteLine("----구분선2---");
//주의해야할 상황 -> for문에서 만약 .Remove로 지운다면
//index가 하나 사라지는데 해당 index에 접근하려고하지말아야한다

2. List 를 실제 배열로 구현

class Ally
{
    public string Name { get; set; }
    public int PosX { get; set; }
    private int PosY { get; set; }

    public Ally()
    {
        Console.WriteLine("생성자 실행");
        Name = "temp";
    }
}
class Troop<T>
{
    //List를 실제로 구현
    T[] army;
    int count; //실제 null이 아닌 T의 보유갯수 기억용

    public int Capacity //배열길이 반환 프로퍼티
    {
        get { return army.Length; }
    }
    public int Count
    {
        get { return count; }
        private set
        {
            if (value < 0) value = 0;
            count = value;
        }
    }

    //인덱서 활용하면 아래의 GetEnemy와 SetEnemy를 안써도됨
    public T this[int index]
    {
        get
        {
            return army[index];
        }
        set
        {
            //인덱스가 카운트보다 크면?
            army[index] = value;
        }
    }
    public Troop(int troopSize)
    {
        army = new T[troopSize];
    }
    public Troop()
    {
        army = new T[4];
        count = 0;
    }

    //특정 인덱스를 주면 거기있는 요소를 지움

    public void RemoveAt(int index)
    {
        //마지막번째 요소는 지우지않음. count로 최대 갯수를 통제하기 때문에
        for (int i = index; i < count - 1; i++)
        {
            army[i] = army[i + 1];
        }
        count--;

    }
    public void Add(T unit)
    {
        //지금 보유중인 배열의 길이 vs count 비교해서 배열이 부족하면 더 늘린다
        if (army.Length <= count)
        {
            //Array.Resize(ref 원본배열, 새로운 크기); //배열 크기 조절
            Array.Resize(ref army, army.Length * 2);
        }
        army[count] = unit;
        count++;
    }
}
class Program
{
    static void Main(string[] args)
    {
    	Troop<Ally> myTeam = new Troop<Ally>();
		myTeam.Add(new Ally());
		myTeam.Add(new Ally());
		myTeam.Add(new Ally { Name = "Krnoya", PosX = 12 }); 		 //생성자를 호출하고 나서 이니셜라이저를 호출.
		Console.WriteLine(myTeam[2].Name); //Krnoya가 출력됨
    }
}

2차원 리스트

List<List<int>> twoDim = new List<List<int>>();
//List<int>[] invenRows = new List<int>[3]; //리스트를 배열형태로.. 다만 배열처럼 3개가 넘어가는순간 더 못만듬 

List<int> invenRowFirst = new List<int>();
List<int> invenRowSecond = new List<int>();
invenRowFirst.Add(10); 
invenRowFirst.Add(20);
twoDim.Add(invenRowFirst);

//0번째 배열에 바로 값을 넣는법?
twoDim[0].Add(1); //[0]번째에는 10, 20 ,1이 들어있음

0개의 댓글