//해당조건을 만족하는 번호를 반환. 없으면 -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()
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)
{
//작동할 코드
}
using System.Linq;
var text = "ABCABD";
var filterText = new string(text.ToCharArray().Distinct().ToArray());
Debug.Log(filterText);
//결과 : ABCD
컬러텍스트 (유니티)
public string ColorText(string text, Color color)
{
return $"<color=#{ColorUtility.ToHtmlStringRGB(color)}>{text}</color>";
}
특정 문자의 사이즈와 컬러를 바꿈
심플타입
public static string HighlightWord(string originalText, string highlightChar, Color highlightColor, int fontSize)
{
var convertText = originalText;
convertText = convertText.Replace(highlightChar.ToLower(), highlightChar.ToUpper());
convertText = convertText.Replace(highlightChar.ToUpper(), $"<size={fontSize}><color=#{ColorUtility.ToHtmlStringRGB(highlightColor)}>{highlightChar.ToUpper()}</color></size>");
return convertText;
}
해쉬키타입, 간단하지만 변경될 문자에 해쉬키의 일부가 있으면 안된다
public static string HighlightWord(string originalText, string highlightChar, Color highlightColor, int fontSize)
{
var convertText = originalText;
string hash = "&*&*&*&*&*&";
for (int i = 0; i < 100; i++)
{
if (originalText.Contains(hash))
{
hash += $"Dummy{(int)Random.Range(0,100)}";
}
else
{
break;
}
}
convertText = convertText.Replace(highlightChar.ToLower(), hash);
convertText = convertText.Replace(highlightChar.ToUpper(), $"<size={fontSize}><color=#{ColorUtility.ToHtmlStringRGB(highlightColor)}>{highlightChar.ToUpper()}</color></size>");
convertText = convertText.Replace(hash, highlightChar.ToLower());
return convertText;
}
레겍스 타입 (미완성임)
public static string HighlightWord(string originalText, string highlightChar, Color highlightColor, int fontSize)
{
var convertText = originalText;
var pattern = new System.Text.RegularExpressions.Regex($"^[{highlightChar.ToLower()}]|[{highlightChar.ToUpper()}]+$");
return pattern.Replace(convertText, $"<size={fontSize}><color=#{ColorUtility.ToHtmlStringRGB(highlightColor)}>{highlightChar.ToUpper()}</color></size>");
}
찾아낸 첫번째 문자만 하이라이트
public static string HighlightWordFirstIndex(string originalText, string highlightChar, Color highlightColor, int fontSize)
{
var convertText = originalText;
var firstIndexLower = originalText.IndexOf(highlightChar.ToLower());
var firstIndexUpper = originalText.IndexOf(highlightChar.ToUpper());
int firstIndex = -1;
if (firstIndexLower==-1)
{
firstIndex = firstIndexUpper;
}
if (firstIndexUpper == -1)
{
firstIndex = firstIndexLower;
}
if (firstIndex == -1)
{
firstIndex = Mathf.Max(firstIndexLower, firstIndexUpper);
}
if (firstIndex == -1)
{
Debug.LogWarning("찾는 문자열이 없음");
return originalText;
}
convertText =convertText.Remove(firstIndex,1);
convertText = convertText.Insert(firstIndex, $"<size={fontSize}><color=#{ColorUtility.ToHtmlStringRGB(highlightColor)}>{highlightChar.ToUpper()}</color></size>");
return convertText;
}
찾아낸 첫번째 글자를 기준으로 분할함
public static string[] SplitFirstIndex(string text, string separator)
{
var splitTextList = new List<string>();
var firstIndexLower = text.IndexOf(separator.ToLower());
var firstIndexUpper = text.IndexOf(separator.ToUpper());
int firstIndex = -1;
if (firstIndexLower == -1)
{
firstIndex = firstIndexUpper;
}
if (firstIndexUpper == -1)
{
firstIndex = firstIndexLower;
}
if (firstIndex == -1)
{
firstIndex = Mathf.Max(firstIndexLower, firstIndexUpper);
}
if (firstIndex == -1)
{
Debug.LogWarning("찾는 문자열이 없음");
return null;
}
if (firstIndex == 0)
{
splitTextList.Add("");
}
else
{
splitTextList.Add(text.Substring(0, firstIndex));
}
if (firstIndex == text.Length)
{
splitTextList.Add("");
}
else
{
splitTextList.Add(text.Substring(firstIndex , text.Length-(firstIndex)));
}
return splitTextList.ToArray();
}
대소문자구분없이 리플레이스
public static string RelaceUL(string text,string oldValue, string newValue)
{
if (string.IsNullOrEmpty(oldValue))
{
return text;
}
var charList = text.ToCharArray().ToList();
{
int i = 0;
while (i+ oldValue.Length-1 < charList.Count)
{
bool replaceCheck = true;
for (int j = 0; j < oldValue.Length; j++)
{
var word = charList[i + j].ToString();
if (System.Text.RegularExpressions.Regex.IsMatch(word, @"^[a-zA-Z]+$"))
{
var oldWord = oldValue[j].ToString();
if (word.ToUpper() != oldWord.ToUpper())
{
replaceCheck = false;
break;
}
}
else if (charList[i + j] != oldValue[j])
{
replaceCheck = false;
break;
}
}
if (replaceCheck)
{
charList.RemoveRange(i, oldValue.Length);
charList.InsertRange(i, newValue.ToCharArray());
i += newValue.Length;
}
else
{
i++;
}
}
}
return new string(charList.ToArray());
}
//Debug.Log(RelaceUL("1text 2Text 3TEXT 4텍스트 5text","text","convert"));
//1convert 2convert 3convert 4텍스트 5convert
//String To HexString
string text = "테스트";
var bytes = System.Text.Encoding.UTF8.GetBytes(text);
var hexString = System.BitConverter.ToString(bytes);
Debug.Log(text);
Debug.Log(string.Join(",", bytes));
Debug.Log(hexString);
//HexString To String
var bytes2 = System.Array.ConvertAll(hexString.Split('-'), x => System.Convert.ToByte(x, 16));
var text2 = System.Text.Encoding.UTF8.GetString(bytes2);
Debug.Log(string.Join(",", bytes2));
Debug.Log(text2);
String To HexString 경량버전
//String To HexString2
string text = "테스트";
var bytes = System.Text.Encoding.UTF8.GetBytes(text);
var hexString = System.BitConverter.ToString(bytes).Replace("-","");
Debug.Log(text);
Debug.Log(string.Join(",", bytes));
Debug.Log(hexString);
//HexString To String2
var bytes2 = new byte[hexString.Length / 2];
for (int i = 0; i < bytes2.Length; i++)
{
bytes2[i] = System.Convert.ToByte(hexString.Substring(i * 2, 2), 16);
}
var text2 = System.Text.Encoding.UTF8.GetString(bytes2);
Debug.Log(string.Join(",", bytes2));
Debug.Log(text2);
Bytes To HexString V1
//bytes To HexString
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (byte b in bytes)
{
sb.Append(b.ToString("X2"));
}
string hexString = sb.ToString();
}
//UTF8 to ASCII
string text = "테스트";
var bytes = System.Text.Encoding.UTF7.GetBytes(text);
var ascii = System.Text.Encoding.ASCII.GetString(bytes);
Debug.Log(text);
Debug.Log(string.Join(",", bytes));
Debug.Log(ascii);
//ASCII to UTF8
var bytes2 = System.Text.Encoding.ASCII.GetBytes(ascii);
var text2 = System.Text.Encoding.UTF7.GetString(bytes2);
Debug.Log(string.Join(",", bytes2));
Debug.Log(text2);