0. Intro : 예시 사용 코드
public class Item
{
public int code;
public string cname;
public Item(int code, string name)
{
this.code = code;
this.name = name;
}
public void Print()
{
Debug.Log($"code : {code}, name : {name}");
}
}
1. Array
public Item[] items = new Item[]
{
new Item(1, "carrot"),
new Item(2, "banana"),
new Item(3, "apple"),
new Item(4, "apple"),
};
1-1. Sort
System.Array.Sort(items, (x, y) => x.code.CompareTo(y.code));
1-2. Foreach
System.Array.ForEach(items, item => item.Print());
1-3. Exists
- 배열 중 하나라도 조건에 해당하는 원소가 있다면 true, 아니면 false
bool b1 = System.Array.Exists(items, x => x.code == 3);
1-4. TrueForAll
- 모든 원소가 조건 달성 시 true, 아니면 false
bool b2 = System.Array.TrueForAll(items, x => x.code > 0);
1-5. Find 계열
Item item1 = System.Array.Find(items, x => x.name == "apple");
int idx1 = System.Array.FindIndex(items, x => x.name == "apple");
Item item2 = System.Array.FindLast(items, x => x.name == "apple");
int idx2 = System.Array.FindLastIndex(items, x => x.name == "apple");
Item[] _items = System.Array.FindAll(items, x => x.name == "apple");
1-6. 얕은 복사
- 불완전 복사 = 포인터가 연결되어 공유
- 동일한 주소를 가리키므로, 같은 값 참조
Item[] _items1 = items;
1-7. 깊은 복사
System.Array.ConvertAll(items, x => new Item(x.code, x.name));
1-8. Reverse
System.Array.Reverse(items);
1-9. Resize
System.Array.Resize(ref items, 5);
2. List
- 리스트(Bidirectional Linked List)
[SerializeField]
List<Item> items = new List<Item>()
{
new Item(1, "A"),
new Item(2, "B"),
new Item(3, "C"),
new Item(4, "D"),
};
2-1. List 순회
for(int i = 0; i < items.Count; ++i)
{
items[i].Print();
}
foreach(var i in items)
{
i.Print();
}
2-2. Add
Item item = new Item(5, "E");
items.Add(item);
2-3. Remove
- Remove(T t)
- 특정 원소 삭제
- 삭제 성공 여부를 bool으로 반환
bool b1 = items.Remove(item);
items.RemoveAt(0);
- RemoveAll(Func)
- 특정 조건을 만족 시, 해당 원소 삭제
- 삭제한 원소 개수 리턴
int count = items.RemoveAll(x => x.code > 5);
2-4. Insert
items.Insert(1, new Item(6, "F"));
2-5. Sort
items.Sort((x, y) => x.code.CompareTo(y.code));
2-6. Reverse
items.Reverse();
2-7. Exists
- 조건을 만족하는 원소가 1개라도 존재 시, true, 아니면 false 리턴
bool b2 = items.Exists(x => x.name == "A");
2-8. TrueForAll
- 리스트의 모든 원소가 조건 만족 시, true
bool b3 = items.TrueForAll(x => x.code > 1);
2-9. Find 계열
Item fi = items.Find(x => x.name == "E");
fi.Print();
int idx = items.FindIndex(x => x.name == "A");
print(idx);
item = items.FindLast(x => x.name == "B");
print(idx);
idx = items.FindLastIndex(x => x.name == "C");
print(idx);
List<Item> _items = items.FindAll(x => x.code > 2);
_items.ForEach(x => x.Print());
2-9. List ↔ Array 변환
Item[] itemArray = items.ToArray();
List<Item> lst = new List<Item>(itemArray);
2-10. 얕은 복사
List<Item> _items1 = items;
_items1[0].code = 10;
2-11. 깊은 복사
List<Item> _items2 = items.ConvertAll(x => new Item(x.code, x.name));
_items2[0].code = 10;
3. Dictionary
- 키와 값으로 구성된 자료구조
- C++의 map과 동일
Item item = items["A"];
3-1. Add
items.Add("F", new Item(6, "F"));
3-2. Remove
items.Remove("F");
3-3. Key & Value
* 특정 아이템의 Key와 Value 접근 가능
foreach(var key in items)
{
print(key.Key);
key.Value.Print();
}
3-4. ContainsKey & ContainsValue
- 아이템이 특정 Key & Value를 가졌는지 확인
bool b1 = items.ContainsKey("A");
bool b2 = items.ContainsValue(item);
3-5. TryGetValue
bool b3 = items.TryGetValue("A", out Item _item);