C#梦游计划

生成随机数

Random rand = new Random();

Random.Next()返回非负随机数;

Random.Next(Int)返回一个小于所指定最大值的非负随机数

Random.Next(Int,Int) 返回一个指定范围内的随机数,例如(1000)(-100,0)返回负数

返回一个共有n位数,其中m位是小数的随机数

function randomXiao(n, m)
{
    var a = Math.pow(10, n + m); //10的n+m次方
    var b = random(a);
    return b = b / Math.pow(10, m);
}

var类型预先不用知道变量的类型;根据给变量赋值来判定变量属于什么类型;如var a =1;aa是整型var a = “qwer”;aa是字符型

使用Var类型要注意:

  1. 必须在定义时初始化,即不能先定义后初始化,如:var a;a = 1; 这样是不允许的
  2. 一旦初始化完成,不能再给变量赋与初始化不同的变量
  3. var类型的变量必须是局部变量

返回一个n到m之间的随机数

function randomNm(n, m)
{
    if(m >= n)
    {
        return random(m - n + 1) + n;//加上1使得m也能在里面
    }
    else return false;
}

返回一个字母

function randomAscii()
{
    var c = String.fromCharCode(random(26) + 65);
    if(random(2)) return c.toLowerCase();
    return c;
}

比较和排序(IComparable和IComparer以及它们的泛型实现)

  • 比较:两个实体类之间按>=<>,=,<进行比较。
  • 排序:在集合类中,对集合类中的实体进行排序。排序基于的算法基于实体类提供的比较函数。

当创建了自己的实体类,如StudentStudent,默认想要对其按照年龄进行排序,则需要为实体类实现IComparableIComparable接口

class Student:IComparable
{
    public string Name { get; set; }
    public int Age { get; set; }

    #region IComparable Members

	public int CompareTo(object obj)
    {
        Student student = obj as Student;
        if (Age > student.Age)	return 1;
        else if (Age == student.Age)	return 0;
        else	return -1;
        //return Age.CompareTo(student.Age);
        //函数完全可以使用该注释代码代替
    }
        #endregion
}

测试用例:

ArrayList studentList;
private void button1_Click(object sender, EventArgs e)
{
    studentList.Sort();//
    foreach (Student item in studentList)
    {
        this.textBox1.Text += item.Name + "----" +item.Age.ToString() + "\r\n"  ;
    }
}

使用IComparerIComparer来实现一个自定义的比较器

class SortName: IComparer
{
    #region IComparer Members

    public int Compare(object x, object y)
    {
        Student s1 = x as Student;
        Student s2 = y as Student;
        return s1.Name.CompareTo(s2.Name);
    }

    #endregion
}

在排序的使用为SortSort方法提供此比较器:

studentList.Sort(new SortName());

泛型实现

上个CompareCompare函数进行了装箱和拆箱,会影响性能。如果集合中有成千上万个复杂的实体对象,则在排序的时候所耗费掉的性能就是客观的。而泛型的出现,就可以避免掉拆箱和装箱。

上文代码中的ArrayListArrayList,应该换成List<T>List<T>,对应的,我们就该实现IComparable<T>IComparable<T>IComparer<T>IComparer<T>

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        studentList = new List<Student>();
        studentList.Add(new Student()
        {
            Age = 1, Name = "a1"
        };
        studentList.Add(new Student()
        {
            Age = 5, Name = "g1"
        };
        studentList.Add(new Student()
        {
            Age = 4, Name = "b1"
        };
        studentList.Add(new Student()
        {
            Age = 2, Name = "f1"
        };
    }
    List<Student> studentList;
    private void button1_Click(object sender, EventArgs e)
    {
        studentList.Sort(new SortName());d
        foreach (Student item in studentList)
        {
            this.textBox1.Text += item.Name + "----" +item.Age.ToString() + "\r\n"  ;
        }
    }
}

class Student:IComparable<Student>
{
    public string Name { get; set; }
    public int Age { get; set; }
    #region IComparable<Student> Members
    public int CompareTo(Student other)
    {
        return Age.CompareTo(other.Age);
    }
    #endregion
}

class SortName: IComparer<Student>
{
    #region IComparer<Student> Members
    public int Compare(Student x, Student y)
    {
        return x.Name.CompareTo(y.Name);
    }
    #endregion
}