前端时间刚刚弄完一个项目,终于有时间来总结与回顾了。

项目需求:给用户发送邮件,邮件分为系统邮件和个人邮件,需要按时间、未读降序排列。

一开始以为,这是一个很简单的需求,给邮件建了一个对象:

class Mail{

private string _title =string.Empty;

public string Title{

get {return _title;}

}

private string _message = string.Empty;

public string Message {

get {return _message;}
}

private bool _isRead = false ;

public bool IsRead {

get {return _isRead}

}

privaite DateTime _insertTime = DateTime.Now;

public DateTime InsertTime{

get {return _insertTime ;}

}

}

然后再 List<Mail> listMails = new List<Mail> 进行冒泡排序(里面已经按时间降序了,现在只需按未读排序)

for(int i=0,count1=listMails.Count;i<count1;i++){

for(int j= i+1;j<count1;j++){

if(listMails[i].IsRead && !listMails[j].IsRead){

Mail temp = listMails[i];

listMails[i] = listMails[j];

listMails[j]=temp;

}

}

}

结果可想而知了,并未按未读降序排列。

改进方法1:对Mail进行深度复制:

[Serializable]

class Mail:ICloneable{

private string _title =string.Empty;

public string Title{

get {return _title;}

}

private string _message = string.Empty;

public string Message {

get {return _message;}
}

private bool _isRead = false ;

public bool IsRead {

get {return _isRead}

}

privaite DateTime _insertTime = DateTime.Now;

public DateTime InsertTime{

get {return _insertTime ;}

}

public object Clone()
{
using (Stream objectStream = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objectStream, this);
objectStream.Seek(0, SeekOrigin.Begin);
return formatter.Deserialize(objectStream) as Employee;
}
}

}

然后再 List<Mail> listMails = new List<Mail> 进行冒泡排序(里面已经按时间降序了,现在只需按未读排序)

for(int i=0,count1=listMails.Count;i<count1;i++){

for(int j= i+1;j<count1;j++){

if(listMails[i].IsRead && !listMails[j].IsRead){

Mail temp = (Mail)listMails[i].Clone();

listMails[i] =  (Mail)listMails[j].Clone();

listMails[j]=temp;

}

}

}

结果还是不行,郁闷了。

最后采用值类型(struct)进行处理:

struct Mail{

private string _title;

public string Title{

get {return _title;}

}

private string _message;

public string Message {

get {return _message;}
}

private bool _isRead;

public bool IsRead {

get {return _isRead}

}

privaite DateTime _insertTime;

public DateTime InsertTime{

get {return _insertTime ;}

}

}

然后再 List<Mail> listMails = new List<Mail> 进行冒泡排序(里面已经按时间降序了,现在只需按未读排序)

for(int i=0,count1=listMails.Count;i<count1;i++){

for(int j= i+1;j<count1;j++){

if(listMails[i].IsRead && !listMails[j].IsRead){

Mail temp = listMails[i];

listMails[i] = listMails[j];

listMails[j]=temp;

}

}

}

测试,一切OK,建议所有的同学,深入理解值类型和引用类型,避免造成不必要的麻烦。

转载,请注明来源,手游基地 www.shouyou888.com,QQD123游戏网 www.qqd123.com

最新文章

  1. android Broadcast介绍
  2. ant+jenkins+testng+selenium集成环境搭建
  3. 遍历nsarray
  4. request常用方法小结
  5. NOIP 2011 提高组 计算系数
  6. YII安装smarty-view-renderer扩展
  7. 用SQL替换最后一个指定字符后面的所有字符
  8. VBS调用keybd_event事件
  9. (转)java中的方法区
  10. react 高阶组件的 理解和应用
  11. Selenium-ActionChainsApi--鼠标连贯操作
  12. 将普通用户添加到sudo
  13. Python:Selenium 2:使用
  14. Codeforces 1099 - A/B/C/D/E/F - (Done)
  15. MongoDB 数据库
  16. 多目标遗传算法 ------ NSGA-II (部分源码解析)辅助变量 双链表操作 list.c
  17. xdoj-1324 (区间离散化-线段树求区间最值)
  18. EFCore中SQLSERVER 2008 的分页问题
  19. Oracle 12C -- 在相同的列的集合上创建多个索引
  20. Eclipse下配置TinyOS开发环境

热门文章

  1. Photoshop:笔刷制作和安装
  2. Visual Studio Support (DDEX)
  3. JAX-RS 2.0 REST客户端编程实例
  4. alias 命令
  5. IPC$命令详解
  6. linux 进入包含空格文件名的文件夹
  7. Linux进程的睡眠和唤醒简析
  8. QTP公开课视频-持续更新中。。。
  9. ios高版本SDK在低版本真机调试
  10. Eclipse中查看JDK源码设置