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

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

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

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

C# 引用类型的"祸害"的更多相关文章

  1. C# - 值类型、引用类型&走出误区,容易错误的说法

    1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...

  2. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  3. 由js apply与call方法想到的js数据类型(原始类型和引用类型)

    原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...

  4. 5.0 JS中引用类型介绍

    其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...

  5. C# 引用类型和值类型

    C# 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 1.引用类型 (1)内存必须从托管堆上分配: (2)堆上分配的每个对象都有一些额外成员(包括“类型对象指针”,“同步块索引”),这些成员 ...

  6. JS高程5.引用类型(1)Object类型

    引用类型 在ECMASCript中,引用类型是一种数据结构,将数据和功能组织在一起,引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法.(注意:尽管ECMAScript从技术上 ...

  7. 通过一个实例重新认识引用类型,值类型,数组,堆栈,ref

    昨天在写代码时候遇到了一个问题,百思不得其解,感觉颠覆了自己对C#基础知识的认知,因为具体的情境涉及公司代码不便放出,我在这里举个例子,先上整个测试所有的代码,然后一一讲解我的思考过程: using ...

  8. Java Native Interface 四--JNI中引用类型

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobjec ...

  9. 一步步学习javascript基础篇(3):Object、Function等引用类型

    我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...

随机推荐

  1. opencv求取RGB分量

    需要注意的是下面r,b,g的类型和顺序 须用IPL_DEPTH_8U类型创建图像且[0][1][2]分量分别是b,g,r. 另外多谢郑乾师兄帮我发现了IPL_DEPTH_8U问题 uchar r,b, ...

  2. Android中的多线程

    final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.han ...

  3. LE33

    MIC5207-3.3YM5 MIC5207-3.3BM5 LE33代码电源管理IC芯片全新原装 http://item.taobao.com/item.htm?spm=a230r.1.14.251. ...

  4. NDK(18)使用C++ STL

    1,在Application.mk 中使用 APP_STL := stlport_static 等. APP_ABI := x86 armeabi APP_PLATFORM := android-15 ...

  5. Image.FrameDimensionsList 属性-----具体使用案例

    上一篇中说到了图片的具体产生以及属性,本篇主要是具体的使用,详情案例见下面的具体视图及代码 using System;using System.Collections.Generic;using Sy ...

  6. bzoj1266: [AHOI2006]上学路线route

    最短路+最小割 首先如何使最短路变长?就是要每一条最短路都割一条边. 我们求出每个点到点1和点n的距离,就可以知道哪些边在最短路上(一开始没有想到求到0和n的距离,想用floyd,但是n=500,怕超 ...

  7. uva580Critical Mass

    递推.   用f[i]代表i个盒子的放法,设g[i]=2^n-f[i],代表i个盒子不满足条件的放法. 枚举第一个U所在的位置j.则方法有g[j-2]*(2^(i-j-2))种,j-1必须是L. 所以 ...

  8. UVa 1636 (概率) Headshot

    既然是第一道概率题,就正儿八经地分析一下吧. 题意: 有一个左轮枪,里面随机装了或者没装子弹,用一个01序列表示.现在已知扣动第一次扳机没有子弹,问是继续扣动扳机还是随机转动一下再扣,那种选择使得第二 ...

  9. 自己遇到的Android虚拟机出现的错误及解决方法【不断更新】

    2012.11.9 第一个: [2012-11-09 13:15:14 - Tesa] Android Launch! [2012-11-09 13:15:14 - Tesa] The connect ...

  10. UVA 10537 The Toll! Revisited uva1027 Toll(最短路+数学坑)

    前者之所以叫加强版,就是把uva1027改编了,附加上打印路径罢了. 03年的final题哦!!虽然是水题,但不是我这个只会做图论题的跛子能轻易尝试的——因为有个数学坑. 题意:运送x个货物从a-&g ...