본문 바로가기

C# 프로그래밍/예제 코드

[C#] 커스텀 리스트 (Custom List)

반응형

배열, 제네릭, 인덱서, 펑션을 이용해서 C#의 리스트를 간단하게 구현해 보았다.

 

먼저 List와 혼용되지 않도록 JList라는 클래스를 제네릭으로 만들어주었다.

이후 리스트에서 많이 쓰인다고 생각되는 Add와 RemoveAt, Find등의 함수와 Count 프로퍼티를 만들어주었다.

public class JList<T>
{
    private T[] customList;
    public T this[int index]
    {
        get { return customList[index]; }
        set { customList[index] = value; }
    }

    public JList(params T[] values)
    {
        customList = new T[values.Length];
        for (int i = 0; i < values.Length; i++)
        {
            customList[i] = values[i];
        }
    }

    public int Count{
        get { return GetCount(); }
    }

    public void Add(T value)
    {
        T[] temp = new T[customList.Length + 1];
        for (int i = 0; i < customList.Length; i++)
        {
            temp[i] = customList[i];
        }
        temp[temp.Length - 1] = value;
        customList = new T[customList.Length + 1];
        for (int k = 0; k < customList.Length; k++)
        {
            customList[k] = temp[k];
        }
    }

    public void RemoveAt(int index){
        T[] temp = new T[customList.Length - 1];
        int idx = 0;
        for (int i = 0; i < customList.Length; i++)
        {
            if (i != index)
                temp[idx++] = customList[i];
        }
        customList = new T[temp.Length];
        for (int k = 0; k < customList.Length; k++)
        {
            customList[k] = temp[k];
        }
    }

    private int GetCount()
    {
        return customList.Length;
    }

    public T Find(Func<T, bool> func)
    {
        try
        {
            foreach (var i in customList)
            {
                if (func(i))
                {
                    return i;
                }
            }
        }
        catch
        {
            Debug.Log("Can't find!");
        }
        return default(T);
    }
}

 

리스트가 잘 만들어졌는지 확인하기 위해서 리스트에 담을 클래스도 만들었다.

그리고 enum타입의 Temperature도 만들어서 추가해주었다.

public class City
{
    public string name;
    public int population;
    public string country;
    public Temperature temperature;
    public City(string _name, int _population, string _country, Temperature _temperature)
    {
        name = _name;
        population = _population;
        country = _country;
        temperature = _temperature;
    }
}

public enum Temperature
{
    extreme_hot,
    hot,
    mild,
    cold,
    extreme_cold,
}

 

아래 처럼 몇가지 예제 소스코드를 작성하고

public class Test0301 : MonoBehaviour
{
    public JList<City> cities = new JList<City>(new City("seoul", 500, "korea", Temperature.cold), new City("osaka", 150, "japan", Temperature.mild));

    void Start()
    {
        cities.Add(new City("busan", 100, "korea", Temperature.mild));
        cities.Add(new City("daegu", 80, "korea", Temperature.extreme_hot));
        cities.Add(new City("reykjavik", 50, "iceland", Temperature.extreme_cold));

        for (int i = 0; i < cities.Count; i++)
        {
            Debug.Log("---------------------------------------------------");
            Debug.Log(cities[i].name);
            Debug.Log(cities[i].country);
            Debug.Log(cities[i].temperature);
        }

        City pohang = new City("pohang", 20, "korea", Temperature.mild);
        cities.Add(pohang);

        cities.RemoveAt(1);
        Debug.Log("==================================================");

        for (int i = 0; i < cities.Count; i++)
        {
            Debug.Log("---------------------------------------------------");
            Debug.Log(cities[i].name);
            Debug.Log(cities[i].country);
            Debug.Log(cities[i].temperature);
        }

        Debug.Log("==================================================");
        City whichIsExtremeColdTemperature = cities.Find(x => x.temperature == Temperature.extreme_cold);
        Debug.Log(whichIsExtremeColdTemperature.name);
    }
}

 

유니티에서 로그를 찍어보면...

아주 잘 동작한다!

반응형