项目中Git要忽略的文件
项目中Git要忽略的文件 红框框起来的部分即为要忽略的文件 1 Unity项目中 要忽略的文件如下图: 2 Visual Studio项目中 要忽略的文件如下图:
项目中Git要忽略的文件 红框框起来的部分即为要忽略的文件 1 Unity项目中 要忽略的文件如下图: 2 Visual Studio项目中 要忽略的文件如下图:
C#构建一个全局的事件管理器 管理器有两个主要部分组成 1.EventManager 2.DataArgs EventManager类 EventManager 是事件管理器的核心类,采用单例模式实现,有三个主要的成员方法,负责事件的添加,删除和触发。 AddEventListener 添加事件 RemoveEventListenter 删除事件 EventFire 触发事件 事件保存在一个字典eventsDict中, 以事件的名称作为字典的key,Value是一个列表,用来保存要触发执行方法 public class EventManager { private Dictionary<string, List<Action<DataArgs>>> eventsDict = new Dictionary<string, List<Action<DataArgs>>>(); private static EventManager instance = null; public static EventManager Instance { get { if(instance == null) { instance = new EventManager(); } return instance; } } public void AddEventListener(string eventName, Action<DataArgs> func) { if (eventsDict.ContainsKey(eventName) && eventsDict[eventName].Contains(func)) { Debug.WriteLine("event aready exist eventName=" + eventName + ", func=" + func.Method.Name); return; } if (!eventsDict.ContainsKey(eventName)) { eventsDict.Add(eventName, new List<Action<DataArgs>>()); } List<Action<DataArgs>> list = eventsDict[eventName]; list.Add(func); } public void RemoveEventListenter(string eventName, Action<DataArgs> func) { if (!eventsDict.ContainsKey(eventName)) { return; } eventsDict[eventName].Remove(func); } public void EventFire(string eventName, DataArgs arg) { if (!eventsDict.ContainsKey(eventName)) { Debug.WriteLine("event doesn't add yet! eventName=" + eventName); return; } List<Action<DataArgs>> list = eventsDict[eventName]; for (int i = 0; i < list.Count; i++) { list[i](arg); } } } DataArgs 事件传递的参数数据 DataArgs 有一个数据字典data用来存放要传的数据,并且暴露了两个方法Set 和 Get 用来设置要传递的数据和获取传过来的数据 ...
C#范围内生成不重复随机数 范围为 [startNum, endNum] , 其中0<=startNum<endNum 。 生成的个数为needNum,并且needNum <= endNum - startNum + 1 因为C#的Random类不进行种子设置的话是伪随机,所以我们要改进一下Random类的Next方法,让它尽可能朝着真随机靠近。 优化后的代码如下: public static int Random(int starNum, int endNum) { byte [] randomBytes = new byte[4]; RNGCryptoServiceProvider rngProvider = new RNGCryptoServiceProvider(); rngProvider.GetBytes(randomBytes); Int32 iSeed = BitConverter.ToInt32(randomBytes, 0); Random random = new Random(iSeed); return random.Next(starNum, endNum + 1); } public static bool IsParameterValid(int startNum, int endNum, int needCount) { if (startNum < 0 || endNum <0 || startNum > endNum || needCount == 0 || needCount > endNum - startNum + 1) { return false; } return true; } 方法一 使用两个数组,从第一个数组中随机位置抽取一个,放到第二个数组中,并且在第一个数组中删除这个值, 接下来从第一个数组的剩余数据中重复上面的步骤,直到第二个数组中获得了目标个数的值停止。 代码如下: public static List<int> PickMethod1(int startNum, int endNum, int needCount) { if (!IsParameterValid(startNum, endNum, needCount)) { return null; } List<int> posList = new List<int>(); List<int> newPosList = new List<int>(); for (int i = 0; i <= endNum - startNum; i++) { posList.Add(i); } int count = 0; while (count < needCount) { int pickPos = Random(0, posList.Count -1); newPosList.Add(posList[pickPos]); posList.RemoveAt(pickPos); count++; } return newPosList; } 优点:从剩余的数据中随机取值,不用判断重复,相对于方法二来说速度会更快,特别是needNum 很接近 endNum - startNum + 1的时候,会更加明显 缺点:需要一个额外的数组,需要更多的内存 方法二 使用HashTable,在一个循环中不停地在范围内随机的取值,并且检查检查这个值是否在HashTable中,如果不存在则存放到Hashtable中, 如果存在则重复前面的步骤,直到Hashtable的Count数量达到想要的数量值。 代码如下: ...