반응형
배열, 제네릭, 인덱서, 펑션을 이용해서 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);
}
}
유니티에서 로그를 찍어보면...
아주 잘 동작한다!
반응형
'C# 프로그래밍 > 예제 코드' 카테고리의 다른 글
[C#] 링버퍼(원형큐) - Ring Buffer(Circular Queue) (0) | 2023.06.13 |
---|---|
[C#] 물고기 군집 시스템 (Fish school system) (0) | 2021.10.10 |