1. VS底下的绿色波浪线是什么意思?
绿色波浪线:
如果你的代码中出现了绿色的波浪线,说明你的代码语法并没有错误,
只不过提示你有可能会出现错误,但是不一定会出现错误。警告线
红色波浪线:
如果你的代码中出现了红色的波浪线,意味着你的代码中出现了
语法错误。
2. 复习一下枚举和字典类
https://www.cnblogs.com/lina-chu/p/8391325.html 作者:雪溪
https://www.cnblogs.com/xiongze520/p/10271350.html 作者:熊泽-学习中的苦与乐
默认情况下,第一个枚举的值为0,之后每个连续枚举数的值加1;若设置某一枚举数的值,之后的枚举数仍然按1递增。
enum Day
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
};
enum Number
{
One = 1,
Two,
Three,
Eleven = 11,
Twelve,
Thirteen
};
枚举中的每个元素的基础类型都是int,可以使用冒号指明另一种整数类型。已经批准的枚举类型有:byte,sbyte,short,ushort,int,uint,long,ulong
enum Month : byte
{
January,
February,
March,
April,
May,
June,
July,
August,
September,
October,
November,
December
};
也可以使用计算值: Hibernating = Sleeping + 5;
**
枚举的定义声明和转换:
**
Day today = Day.Wednesday;
Console.WriteLine($"today is {today}");
int dayNumber = (int)today;
Console.WriteLine($"{today} is day number {dayNumber}");
Month month = Month.January;
byte monthNumber = (byte)month;
Console.WriteLine($"{month} is month number {monthNumber}");
枚举的一些方法:
方法 | 名称 |
---|---|
CompareTo | 将此实例与指定对象进行比较并返回一个对二者的相对值的之事 |
Equals | 指示此实例是否等于指定的对象 |
Format | 根据指定格式将指定枚举类型的指定值转换为其等效的字符串表示形式 |
GetName | 在指定枚举中检索具有指定值的常数的名称 |
GetNames | 检索指定枚举中常数名称的数组 |
GetTypeCode | 返回此实例的基础 TypeCode |
GetUnderlyingType | 返回指定枚举的基础类型 |
GetValues | 索指定枚举中常数值的数组 |
HasFlag | 确定当前实例中是否设置了一个或多个位域 |
IsDefined | 返回指定枚举中是否存在具有指定值的常数的指示 |
Parse | 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 一个参数指定该操作是否不区分大小写 |
TryParse | 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 用于指示转换是否成功的返回值 |
标志枚举
标志枚举要在顶部加上[System.Flags]特性进行声明。而且枚举支持组合运算。
这种位运算是非常有用的,再sql语句里面也支持位运算。也就是说,把一个枚举运算后的结果存入数据库之后,还能够按照你的要求读取出来,比如:
将一个“高帅”的值存入数据库,那么存进去的值就是整型5:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace enumApplication
{
class Program
{
static void Main(string[] args)
{
var man = People.高 | People.帅; //赋值为101 计算方法001或上100,结果是101
Console.WriteLine("高和帅的枚举值和为:"+(int)man);
if ((man & People.高) == People.高) //101 man
{ //001 高 逐位相与,
Console.WriteLine("此人:高"); //001 如果结果是高,就可以反推出man包含 高
}
else
{
Console.WriteLine("此人:矮");
}
Console.ReadKey();
}
[System.Flags]
public enum People:int
{
高 = 1, //001
富 = 2, //010
帅 = 4, //100
}
}
}
(这个位运算不是很懂…)
字典类:
https://www.cnblogs.com/ChenMM/p/9479987.html 作者:一颗豆豆
Dictionary 提供快速的基于键值(Key)的元素查找;和哈希表很像也是一种无序的结构。
结构是:Dictionary<[key], [value]>, 当你有很多元素的时候可以用它;
要使用Dictionary,需要先导入C#泛型命名空间System.Collections.Generic,在使用前,你必须声明它的键类型和值类型。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Demo1
{
class Program
{
static void Main(string[] args)
{
//创建泛型哈希表,Key类型为int,Value类型为string
Dictionary<int, string> myDictionary = new Dictionary<int, string>();
//1.添加元素
myDictionary.Add(1, "a");
myDictionary.Add(2, "b");
myDictionary.Add(3, "c");
//2.删除元素
myDictionary.Remove(3);
//3.假如不存在元素则添加元素
if (!myDictionary.ContainsKey(4))
{
myDictionary.Add(4, "d");
}
//4.显示容量和元素个数
Console.WriteLine("元素个数:{0}",myDictionary.Count);
//5.通过key查找元素
if (myDictionary.ContainsKey(1))
{
Console.WriteLine("key:{0},value:{1}","1", myDictionary[1]);
Console.WriteLine(myDictionary[1]);
}
//6.通过KeyValuePair遍历元素
foreach (KeyValuePair<int,string>kvp in myDictionary)
{
Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);
}
//7.得到哈希表键的集合
Dictionary<int, string>.KeyCollection keyCol = myDictionary.Keys;
//遍历键的集合
foreach (int n in keyCol)
{
Console.WriteLine("key={0}", n);
}
//8.得到哈希表值的集合
Dictionary<int, string>.ValueCollection valCol = myDictionary.Values;
//遍历值的集合
foreach( string s in valCol)
{
Console.WriteLine("value:{0}",s);
}
//9.使用TryGetValue方法获取指定键对应的值
string slove = string.Empty;
if (myDictionary.TryGetValue(5, out slove))
{
Console.WriteLine("查找结果:{0}", slove);
}
else
{
Console.WriteLine("查找失败");
}
//10.清空哈希表
//myDictionary.Clear();
Console.ReadKey();
}
}
}
输出结果:
https://blog.csdn.net/BillCYJ/article/details/81015598 作者:Real_JumpChen
如果要修改已有key对应的value,可以这样做:
2.Unity5.4以下的版本,最好不要用foreach来遍历字典:
法一:foreach遍历字典,会生成GC:
法二:对于我这种需求,使用for循环,会生成更多的GC,因为存在mActMergeRedPointKey这个局部List变量
法三:使用迭代器,不会生成GC:
3.根据key取value,最好使用 TryGetValue 而不是 ContainsKey+根据key索引value:
法一:ContainsKey+根据key索引value,不好,用了两次查找,第一次:ContainsKey,第二次:myDictionary[key]
if(myDictionary.ContainsKey(key))
{
// 通过key索引value
int resValue = myDictionary[key];
}
法二:TryGetValue的方法:
int resValue ;
myDictionary.TryGetValue(key, out resValue);
使用TryGetValue 更快,性能更好,因为只用了一次查找,TryGetValue比ContainsKey后使用[key]取value,速度快一倍;
TryGetValue更安全,找不到value时返回false,而使用ContainsKey后使用【key】取value取不到时,会抛出异常导致真机卡死。
e.g.
private Dictionary<uint, MyPet> myPets;
public List<MyPet> GetShowPets()
{
List<MyPet> pets = new List<MyPet>();
if (null != myPets)
{
var e = myPets.GetEnumerator();
while (e.MoveNext())
{
if (CheckPetShow(e.Current.Key))
{
pets.Add(e.Current.Value);
}
}
}
//根据配置表权重进行升序排序
pets.Sort(
delegate (MyPet pet1, MyPet pet2)
{
return pet1.PetRankWeight.CompareTo(pet2.PetRankWeight);
});
return pets;
}
https://blog.csdn.net/yinghuolsx/article/details/72952857 下次再来学习
https://blog.csdn.net/u013477973/article/details/65635737
https://dsqiu.iteye.com/blog/2029701