本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Array / List / Dictionary之相互转换
声明测试数据:
string[] testAarray = new string[] { "array01", "array02", "array03", "array04", "array05" };
List<string> testList = new List<string>() { "list01", "list02", "list03", "list04", "list05" };
Dictionary<int, string> testDic = new Dictionary<int, string>() { { 1, "dictionary01" }, { 2, "dictionary02" }, { 3, "dictionary03" } };
Array数组的 复制、转List、转Dictionary:
- Array复制 目标数组.CopyTo(接收数组, 复制起点)
string[] copyArray = new string[5];
testAarray.CopyTo(copyArray, 0);
- Array转List
List<string> arrayToList = new List<string>(testAarray);
- Array转Dictionary 引入命名空间using System.Linq;Array下标作为Dictionary的key,元素作为value,利用lambda转换
Dictionary<int, string> arrayToDic = testAarray.ToDictionary(arrayItem => System.Array.IndexOf(testAarray, arrayItem), arrayItem => arrayItem);
List列表的 复制、转Array、转Dictionary:
- List复制
List<string> copyList = new List<string>(testList);
- List转Array List.ToArray(),或者,List复制到Array,与Aarray.CopyTo相同,调用List.ToArray()
string[] listToArray = testList.ToArray();
//或
string[] listCopyToArray = new string[5];
testList.CopyTo(listCopyToArray, 0);
- List转Dictionary 与Array转Dictionary相同
Dictionary<int, string> listToDic = testList.ToDictionary(listItem => testList.IndexOf(listItem), listItem => listItem);
Dictionary字典的 复制、转Array、转List:
- //Dictionary复制
Dictionary<int, string> copyDic = new Dictionary<int, string>(testDic);
- Dictionary转Array
int[] dictionaryKeyToArray = testDic.Keys.ToArray<int>();
string[] dictionaryToArray = testDic.Values.ToArray<string>();
- Dictionary转List
List<int> dictionaryKeyToList = testDic.Keys.ToList<int>();
List<string> dictionaryToList = testDic.Values.ToList<string>();
# 判断某元素是否在List内、从List中获取指定元素 各方式效率对比
判断或获取方式:# List.Exists、List.Contains、List.Find、Linq
测试代码:
List<int> testList = new List<int>();
for(int i = 0; i < 10000; i++)
{
testList.Add(i);
}
DateTime startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
if(testList.Contains(i))
{ }
}
Debug.Log(DateTime.Now - startTime + " : Contains");
startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
if(testList.Exists(item => item == i))
{ }
}
Debug.Log(DateTime.Now - startTime + " : Exists");
startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
if(testList.Any(item => item == i))
{ }
}
Debug.Log(DateTime.Now - startTime + " : Any");
startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
testList.FirstOrDefault(item => item == i);
}
Debug.Log(DateTime.Now - startTime + " : First");
startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
testList.Where(item => item == i).FirstOrDefault();
}
Debug.Log(DateTime.Now - startTime + " : Where");
startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
testList.Find(item => item == i);
}
Debug.Log(DateTime.Now - startTime + " : Find");
startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
for(int j = 0; j < testList.Count; j++)
{
if(i == testList[j])
break;
}
}
Debug.Log(DateTime.Now - startTime + " : For");
测试结果:
用List再测一下:
List<string> testList = new List<string>();
for(int i = 0; i < 10000; i++)
{
testList.Add(i.ToString());
}
DateTime startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
if(testList.Contains("5000"))
{ }
}
Debug.Log(DateTime.Now - startTime + " : Contains");
startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
if(testList.Exists(item => item == "5000"))
{ }
}
Debug.Log(DateTime.Now - startTime + " : Exists");
startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
if(testList.Any(item => item == "5000"))
{ }
}
Debug.Log(DateTime.Now - startTime + " : Any");
startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
testList.FirstOrDefault(item => item == "5000");
}
Debug.Log(DateTime.Now - startTime + " : First");
startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
testList.Where(item => item == "5000").FirstOrDefault();
}
Debug.Log(DateTime.Now - startTime + " : Where");
startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
testList.Find(item => item == "5000");
}
Debug.Log(DateTime.Now - startTime + " : Find");
startTime = DateTime.Now;
for(int i = 0; i < 20000; i++)
{
for(int j = 0; j < testList.Count; j++)
{
if("5000" == testList[j])
break;
}
}
Debug.Log(DateTime.Now - startTime + " : For");
测试结果:
测试结论:
- 判断某元素是否在List内,List.Exists优于List.Contains;
- 从List中获取指定的元素,List.Find优于Linq,优于For循环。