昨天處理到 server room 的 list update, 希望嘗試 list compare delegates, 結果把整個編程思路重新優化.
原本是希望找出 2 條 list 中的的不同的地方並且進行不同的操作.
List<RoomInfo> _newRooms = _serverRooms.FindAll(delegate(RoomInfo thisRoom) { return !mRooms.Exists(delegate(RoomInfo i){ return i.name!=thisRoom.name; }); }); List<RoomInfo> _existButUpdatedRooms = _serverRooms.FindAll(delegate(RoomInfo thisRoom) { if( mRooms.Exists(delegate(RoomInfo i){return i.name!=thisRoom.name;}) ) { return false; // exists but same. } RoomInfo _found = mRooms.Find(delegate(RoomInfo obj) { return thisRoom.name.Equals(obj.name); }); if( ReferenceEquals(null,_found) ) { return false; // not exists } if( thisRoom.playerCount!=_found.playerCount ) { return true; // need update. } // little difference, but we don't care. return false; }); // find non-existed room, remove those in mRooms mRooms.RemoveAll(delegate(RoomInfo thisRoom) { return _serverRooms.Exists(delegate(RoomInfo i){ return i.name!=thisRoom.name; } ); });
這是第一次寫的垃圾 code 也不知道是否能跑 XD, 一堆 delegate, 看也看傻了.
覺得太煩瑣就找一下是否有 short form. 然後就修改為
List<RoomInfo> _newRooms = _serverRooms.FindAll(thisRoom => !mRooms.Exists(i=> i.name!=thisRoom.name) ); List<RoomInfo> _existButUpdatedRooms = _serverRooms.FindAll(thisRoom=>{ if( mRooms.Exists(i => i.name!=thisRoom.name) ) { return false; // exists but same. } RoomInfo _found = mRooms.Find(obj => thisRoom.name.Equals(obj.name)); if( ReferenceEquals(null,_found) ) { return false; // not exists } if( thisRoom.playerCount!=_found.playerCount ) { return true; // need update. } // little difference, but we don't care. return false; }); // find non-existed room, remove those in mRooms mRooms.RemoveAll(thisRoom => _serverRooms.Exists(i=>i.name!=thisRoom.name));
開始找到感覺, 然後又發現一些因為寫太長太曲折所以想錯的地方… double anti… 之類的地方.
也把常用的 room name checking 另寫 function.
_serverRooms.ForEach(_room => { RoomInfo _found = mOldRooms.Find(pt=>IsSameRoom(pt,_room) ); if( _found!=null ) { // update player numbers. } else { // if it's a new room } }); // find non-existed room, remove those in mRooms mOldRooms.RemoveAll(_room => !_serverRooms.Exists(pt=> IsSameRoom(pt,_room)) ); /////////////////////////////////////////////////// private bool IsSameRoom(RoomInfo _r1, RoomInfo _r2) { return _r1.name.Equals(_r2.name); }
又一次証明把coding 寫得精簡真的很重要. (O.o)>
Huan-Lin 文章中有列出4種的變種寫法.
Predicate<Employee> p1 = delegate(Employee e) { return e.Name.StartsWith("J"); }; Predicate<Employee> p2 = (e) => { return e.Name.StartsWith("J"); }; Predicate<Employee> p3 = e => { return e.Name.StartsWith("J"); }; Predicate<Employee> p4 = e => e.Name.StartsWith("J") ;
參考文件 : delegate