2020. 7. 29. 19:25
Unity/C#
배열 생성 이상한방식
//1차원
Array array1 = Array.CreateInstance(typeof(int), 사이즈);
//2차원
Array array2 = Array.CreateInstance(typeof(int), X사이즈, y사이즈);
//가변
Array arrayMain = Array.CreateInstance(typeof(Array), 2);
BossArray.SetValue(array1, 0);
BossArray.SetValue(array2, 1);
배열관련 함수
//해당조건을 만족하는 번호를 반환. 없으면 -1
var nameAIndex = System.Array.FindIndex(array,x => x.name == "A");
//해당조건을 만족하는 값을 반환.
var nameA = System.Array.Find(array,x => x.name == "A");
//해당조건을 만족하는 값들을 반환. RemoveAll대용으로도 사용가능
var nameAs = System.Array.FindAll(array,x => x.name == "A");
//중복되는것만 추출
var redundantArray = System.Array.FindAll(array, x => List.Contains(x));
//중복되는것만 추출2
redundantArray = System.Array.FindAll(array, x => System.Array.FindIndex(array2,y=>y==x)>=0);
//RemoveAll(삭제)용도일경우
System.Array.FindAll(배열,x => x.name != "A");
//해당조건을 만족하는게 한개라도 존재하는지
System.Array.Exists(배열,x => x.name == "A");
//내용물에 전부 1을 더하여 반환
int[] 배열=System.Array.ConvertAll(배열,x => x+1);
//변수값 0으로 초기화
int[] 배열=System.Array.ConvertAll(배열,x => 0);
//bool[] 중 하나라도 true인지 검사
return System.Array.Find(bools, x => x == true);
//bool[] 중 하나라도 true인지 검사 2
System.Array.TrueForAll(toggles, x => x.isOn == false)
//array가 List안에 전부 포함되어 있는지 검사
if (System.Array.TrueForAll(array, x => List.Contains(x)))
배열관련 함수 Linq계열
using System.Linq;
//맥스값 추출
arrayCount = array.Max(x => x.level);
//맥스값'들' 추출
var timeMax = saves.Max(save => save.time);
var timeMaxSaves = System.Array.FindAll(saves,save => save.time == timeMax);
//평균추출
var average = array.Average();
//중복제거(중복제거의 반대는 FindAll을 쓴다)
array = array.GroupBy(x => x.Substring(0,3)).Select(x=>x.First()).ToArray(); //앞글자 3개가 똑같다면 제거
array = array.GroupBy(x => x).Select(x=>x.First()).ToArray(); //완벽히 동일한것만 제거
//셔플(미세한 편향)
System.Random seed = new System.Random((System.Int32)System.DateTime.Now.Ticks);
array = array.OrderBy(a => seed.Next()).ToArray();
//셔플 유니티타입(미세한 편향)
array = array.OrderBy(a => Random.value).ToArray();
//정렬
array = array.OrderBy(x => x).ToArray();
//합치기
if(array2 != null)
{
array1 = array1.Concat(array2).ToArray();
}
//인자1개 추가
array1 = array1.Append(data).ToArray();
//슬라이스(자르기)
var array = new int[] { 1, 2, 3, 4, 5 };
var length = 3;
var sliceArray = array.Take(length).ToArray();
Debug.Log(string.Join(", ", sliceArray));
//결과: 1,2,3
//슬라이스2 (중간부터)
var array = new int[] { 1, 2, 3, 4, 5 };
var startIndex = 1;
var length = 3;
var sliceArray = array.Skip(startIndex).Take(length).ToArray();
Debug.Log(string.Join(", ", sliceArray));
//결과: 2,3,4
//슬라이스3 (뒤에서부터)
var array = new int[] { 1, 2, 3, 4, 5 };
var length = 3;
var sliceArray = array.Skip(array.Length-length).ToArray();
Debug.Log(string.Join(", ", sliceArray));
//결과: 3,4,5
//해당조건을 만족하는 값을 반환
//FirstOrDefault (System.Array.Find와 동일)
var nameA = array.FirstOrDefault(x => x.name == "A");
//모두 true인지 검사
//Array.TrueForAll과 동일하다
var allNameA = array.All(x => x.name == "A");
//하나라도 true인지 검사
//Find검사로 비슷하게 구현할수 있다
var anyNameA = array.Any(x => x.name == "A");
Array.Copy
var array1 = new int[] { 1, 2, 3, 4, 5 };
var array2 = new int[] {6,7,8,9,10 };
System.Array.Copy(array1, array2, 3);
Debug.Log(string.Join(", ", array2));
//결과 1,2,3,9,10
배열깊은복사 (배열복제)
var stringArrayClone = (string[])stringArray.Clone();
오브젝트 리스트를 스트링배열로 변경
using System.Linq;
var list = new List<object> ();
list.Cast<string>().ToArray()
FindIndexAll
public static class Array
{
public static int[] FindIndexAll<T>(T[] array, System.Predicate<T> match)
{
var indexList = new List<int>();
for (int i = 0; i < array.Length; i++)
{
if (match.Invoke(array[i]))
{
indexList.Add(i);
}
}
return indexList.ToArray();
}
}
중간에 끼워넣기
var randomIndex=(int)Random.Range(0,list.Count);
list.Insert(randomIndex, memorizeList[index]);
list.RemoveAt(index);
이동평균함수
고속으로 처리할일이 생겨서 만듦
써보니까 앞부분은 처리해도 도움이 안 되길래 과감히 지우는쪽으로 했다
double[] MovingAverageHS(double[] datas,int period)
{
if (datas.Length< period)
{
return null;
}
var movingAverages = new double[datas.Length- period + 1];
var sum = 0.0;
for (int i = 0; i < period; i++)
{
sum += datas[i];
movingAverages[0]=sum/ period;
}
for (int i = period; i < datas.Length; i++)
{
sum = sum - datas[i - period] + datas[i];
movingAverages[i - period + 1] = sum / period;
}
return movingAverages;
}
인덱스 체크 간소화
근데 어차피 쓰려면 null체크 추가로 들어가서 그렇게 효율적이진 않음
오히려 협업할때는 누구나 알기쉬운 위쪽이 나을수도 있겠다
if((index >= 0) && (index < array.Length))
{
var item = array[index];
//작동할 코드
}
//위아래 동일
var item = array.ElementAtOrDefault(index);
if(item != null)
{
//작동할 코드
}
'Unity > C#' 카테고리의 다른 글
C# 파일관련 함수들 (0) | 2020.07.30 |
---|---|
유니티 키보드 (0) | 2020.07.28 |
c# @변수 (0) | 2020.07.28 |