[C#学习笔记13]泛型集合List详解、比较器接口动态排序、集合数据源展示
集合定义不用规定元素个数
泛型表示程序特性,定义时无需指定特定类型,使用时必须明确类型。应用在集合、方法、类中,用<T>表示
List<Course> courseList = new List<Course>();//Course是上一笔记中的类
courseList.Add(course1);
courseList.Add(course2);
使用集合初始化器,将元素一次性的初始化到集合中
List<Course> couseList = new List<Courses>() {course1,course2};
数组中的元素添加到集合中
Course[] courseArray1 = new Course[] {course1,course2};
List<Course> couseListFromArray = new List<Course>();
courseListFromArray.AddRange(courseArray1);
集合转换成数组
Course[] courseArray2 = courseList.ToArray();
数组直接转换成集合
List<Course> courseList3 = courseArray2.ToList();
删除元素
courseList.Remove(course3);
courseList.RemoveAll(c >= c.Coursed > 10002);
courseList.RemoveAt(2);
courseList.RemoveRange(1,2);
//集合遍历的两种方式
public void TraversalList1(List<Course> courseList)
{
for (int i = 0; i < courseList.Count; i++)
{
Console.WriteLine($"{courseList[i].CourseId}\t{courseList[i].CourseName}\t{courseList[i].ClassHour}\t{courseList[i].Teacher}");
}
}
public void TraversalList2(List<Course> courseList)
{
foreach (Course item in courseList)
{
Console.WriteLine($"{item.CourseId}\t{item.CourseName}\t{item.ClassHour}\t{item.Teacher}");
}
}
/// <summary>
/// 集合快速查询方法
/// </summary>
/// <param name="courseList"></param>
public void QueryElements(List<Course> courseList)
{
//集合查询方法1
List<Course> result1 = courseList.FindAll(c => c.CourseId > 10003);
//集合查询方法2
var result2 = from c in courseList where c.CourseId > 10003 select c;
var result3 = result2.ToList();
}
集合元素排序
public void ListOrder()
{
//值类型元素的排序
Console.WriteLine("\r\n----------------------值类型元素排序------------------\r\n");
List<int> ageList = new List<int> { 20, 19, 25, 30, 26 };
ageList.Sort();//默认按照升序排列
foreach (int item in ageList)
{
Console.WriteLine(item);
}
ageList.Reverse();
Console.WriteLine("-------------");
foreach (int item in ageList)
{
Console.WriteLine(item);
}
对象集合
//对象集合元素排序(默认)
Console.WriteLine("\r\n----------------------集合默认排序------------------\r\n");
List<Course> courseList = CreateCourses();
courseList.Sort();
//以上Sort方法默认会报错的!所以在Course类中实现系统接口IComparable<Course>
TraversalList1(courseList);
//以上我们使用默认比较器进行排序,很不方便,如果我们需要多种排序,怎么办?
//比较器接口:其实就是我们可以任意的指定对象属性排序,从而实现动态排序。
//集合元素动态排序
Console.WriteLine("\r\n----------------------集合动态排序------------------\r\n");
//排序方法的定义: public void Sort(IComparer<T> comparer);
courseList.Sort(new CourseIdASC());
Console.WriteLine("-----------按照编号升序---------\r\n");
TraversalList1(courseList);
Console.WriteLine("\r\n-----------按照编号将序---------\r\n");
courseList.Sort(new CourseIdDESC());
TraversalList1(courseList);
//重要的是理解多态的原理,因为Sort这个重载的方法就是多态原理的一个应用。
//后面深入学习架构开发等更高级的理论,技能,设计模式等,处处都在用多态!
Console.WriteLine("\r\n--------后面高级课程中,使用LINQ实现排序------------");
var list1 = from c in courseList orderby c.CourseId ascending select c;
TraversalList1(list1.ToList());
Console.WriteLine("\r\n--------后面使用扩展方法OrderByDescending实现降序------------");
var list2 = courseList.OrderByDescending(c => c.CourseId);
TraversalList1(list2.ToList());
Console.WriteLine("\r\n--------后面使用扩展方法OrderBy实现升序序------------");
var list3 = courseList.OrderBy(c => c.ClassHour);
TraversalList1(list3.ToList());
}
#endregion
}
自定义排序类:根据需要,添加对应个数的排序类
/// <summary>
/// 课程编号升序
/// </summary>
class CourseIdASC : IComparer<Course>
{
public int Compare(Course x, Course y)
{
return x.CourseId.CompareTo(y.CourseId);
}
}
/// <summary>
/// 课程编号降序
/// </summary>
class CourseIdDESC : IComparer<Course>
{
public int Compare(Course x, Course y)
{
return y.CourseId.CompareTo(x.CourseId);
}
}
/// <summary>
/// 课时升序
/// </summary>
class CourseClassASC : IComparer<Course>
{
public int Compare(Course x, Course y)
{
return x.ClassHour.CompareTo(y.ClassHour);
}
}
类:系统接口以I开头<>,点击智能标签实现接口就显示了接口对应的比较方法不要动
public class Course : IComparable<Course>
{
public Course() { }
public Course(int courseId, string courseName, int classHour, string teacher)
{
this.CourseId = courseId;
this.CourseName = courseName;
this.ClassHour = classHour;
this.Teacher = teacher;
}
public int CourseId { get; set; }//课程编号
public string CourseName { get; set; }//课程名称
public int ClassHour { get; set; }//课时
public string Teacher { get; set; }//主讲老师
//接口对应的比较方法(这个方法的签名,千万不要动)
public int CompareTo(Course other)
{
//return this.CourseId.CompareTo(other.CourseId);
return other.CourseId.CompareTo(CourseId);
//如果把this放到前面,表示按照升序排列,other放到前面就是按照降序排列
}
}