原代码:
当时entityList中的数据量:4704;length : 2
private static void OperateRemove ( List<Entity> entityList, int length) {
entityList.RemoveAll( delegate( Entity entity) {
List<Entity > list = entityList.FindAll( delegate( Entity innerEntity) {
return entity.A== innerEntity.A} );
return null != list && list .Count < length;
} );
}
第一方案:初步认为是数据未排序,所以FindAll会慢。所以
private static void OperateRemove ( List<Entity> entityList, int length) {
entityList.Sort( delegate( Entity entity1, HotelRoomPriceEntity entity2) {
return entity1.A.CompareTo( entity2.A);
} );entityList.RemoveAll( delegate( Entity entity) {
List<Entity > list = entityList.FindAll( delegate( Entity innerEntity) {
return entity.A== innerEntity.A} );
return null != list && list .Count < length;
} );
}
当时程序跑过之后,微秒时间为:7901
第二方案:看来问题瓶颈还是在FindAll,所以通过一次查询先把要删除的entity.A查找出来,后面集中删除。
private static void OperateRemove ( List<Entity> entityList, int length) {
entityList.Sort( delegate( Entity entity1 , Entity entity2 ) {
return entity1.A.CompareTo( entity2.A);
} );
int eachACount = 0;
int A= 0;
int nextA= 0;
List<int> lackAEntityList= new List<int>();
foreach ( Entity entity in entityList) {
if ( 0 == A) {
A= entity.A;
nextA= entity.A;
}
else {
nextA= entity.A;
}
if ( A != nextA) {
if ( length> eachACount ) {
lackAEntityList.Add( roomId );
}
A = nextA;
eachACount = 0;
}
eachACount ++;
}
entityList.RemoveAll( delegate( Entity entity) {
return lackAEntityList.Exists( delegate( int A) {
return entity.A== A;
} );
} );
}
当时程序跑过之后,微秒时间为:40
当然还有其他解决方案:如使用sortlist+binarySearch,Etc.
不过40对我们来说,已经比较理想。
另外附上
目标:
/// 根据A-List中的HotelID查找B-List中RoomID为0,
/// 删除对应B-List中的有关于HotelID所有RoomId全为空的配备信息
/// 同时也要删除A-List中对应的信息
public List<RoomEntity> RemoveRoomIDAllEmpty()
{
///创建存放RoomID不为空的HotelIDList
List<Int32> hotelIdList = new List<int>();
roomList.ForEach(delegate(RoomEntity re)
{
if (hotelList.Contains(re.HotelId))
{
if (re.roomId != 0)
{
hotelIdList.Add(re.HotelId);
}
}
});
//删除RoomList中的有关于HotelID所有RoomId全为空的配备信息
roomList.RemoveAll(delegate(RoomEntity re)
{
return !hotelIdList.Contains(re.HotelId);
});
//删除HotelList中的对应信息
hotelList.RemoveAll(delegate(Int32 i)
{
return !hotelIdList.Contains(i);
});
return roomList;
}
List<Int32> hotelList = new List<Int32> {
1,2,3,4,5,6,7,8,9,10
};
List<RoomEntity> roomList = new List<RoomEntity> {
new RoomEntity{ HotelId =1,roomId=1111},
new RoomEntity{ HotelId =1,roomId=0},
new RoomEntity{ HotelId =1,roomId=1111},
new RoomEntity{ HotelId =1,roomId=0},
new RoomEntity{ HotelId =1,roomId=1111},
new RoomEntity{ HotelId =2,roomId=0},
new RoomEntity{ HotelId =2,roomId=0},
new RoomEntity{ HotelId =2,roomId=0},
new RoomEntity{ HotelId =2,roomId=0},
new RoomEntity{ HotelId =4,roomId=1111},
new RoomEntity{ HotelId =5,roomId=1111},
new RoomEntity{ HotelId =3,roomId=1111},
new RoomEntity{ HotelId =4,roomId=1111},
new RoomEntity{ HotelId =1,roomId=1111},
new RoomEntity{ HotelId =6,roomId=1111},
new RoomEntity{ HotelId =1,roomId=1111},
new RoomEntity{ HotelId =5,roomId=1111},
new RoomEntity{ HotelId =8,roomId=1111},
new RoomEntity{ HotelId =7,roomId=0},
new RoomEntity{ HotelId =4,roomId=1111},
new RoomEntity{ HotelId =8,roomId=1111},
new RoomEntity{ HotelId =9,roomId=1111},
new RoomEntity{ HotelId =10,roomId=0},
new RoomEntity{ HotelId =10,roomId=0}
};