List集合详解

================================Person.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace ConsoleApplication2
{
    public class Person : IComparable<Person>, IFormattable
    {
        public decimal Money { get; private set; }
        public string Name { get; private set; }
        public Person(string name,decimal money )
        {
            this.Name = name;
            this.Money = money;
        }
       
        public string ToString(string format, IFormatProvider formatProvider)
        {
            if (format == null) return ToString();
            switch (format)
            { 
                case "N":
                    return string.Format("姓名:{0}", Name);
 
                case "M":
                    return string.Format("收入:{0}", Money);
                    
                default:
                    return ToString();
                    
            }
            
        }
        public override string ToString()
        {
            return string.Format("姓名:{0},收入:{1}", Name, Money);
        }
 
        public int CompareTo(Person other)
        {
            int resouce = other.Money.CompareTo(this.Money);//降序
            if (resouce == 0)
            {
                resouce = other.Name.CompareTo(this.Name);
            }
            return resouce;
        }
    }
}

================================Student.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
    [Serializable]//指示一个类可以序列化,不可以继承
    public class Student
    {
        public string Name { get; set; }
        public Student(string name)
        {
            this.Name = name;
        }
        public override string ToString()
        {
            return string.Format("我是学生了,姓名:{0}", this.Name);
        }
    }
}

================================主程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
 
            //=============================集合初始值设定项
            List<int> i = new List<int>() { 1, 2 };
            List<string> s = new List<string>() { "a", "b" };
            //=============================添加元素
            Person p1 = new Person("张飞", 100.00m);
            Person p2 = new Person("关羽", 150.00m);
            List<Person> p = new List<Person>() { p1, p2 };//集合初始值设定项
            p.Add(new Person("诸葛亮", 500.00m));
            p.AddRange(new Person[] { new Person("赵云", 50.00m), new Person("马超", 100.00m) });//添加集合
            List<Person> per = new List<Person>(new Person[] { new Person("赵云", 50.00m), new Person("马超", 100.00m) });//构造对象
            //=============================插入元素
            p.Insert(1, new Person("黄忠", 100.00m));
            p.InsertRange(0, new Person[] { new Person("魏延", 80.00m), new Person("庞统", 100.00m) });//批量插入
            p.InsertRange(0, new Person[] { new Person("魏延", 80.00m), new Person("庞统", 100.00m) });//批量插入
            //=============================删除元素
            //p.Remove(p1);//按对象删除
            //p.RemoveAt(0);//按索引删除
            p.RemoveRange(0, 1);//第一个参数开始索引位置;第二个参数删除的个数
            //=============================查找元素
            Console.WriteLine(p.Exists(r => r.Name == "张飞"));//找到返回True,否则返回false
            Console.WriteLine(p.IndexOf(p1)); //根据对象查找,【找到为1,没找到为-1】
            Console.WriteLine(p.LastIndexOf(p1));//根据对象查找,从后往前查
            Console.WriteLine(p.FindIndex(new FindPreson("庞统").Equals));//根据姓名查找,【返回索引】
            Console.WriteLine(p.FindIndex(r => r.Name == "庞统"));//FindIndex lambda方式
            Console.WriteLine(p.FindLastIndex(r => r.Name == "庞统"));//和FindIndex相似,从最后一个往前找
            Console.WriteLine(p.Find(r => r.Name == "庞统").ToString());//根据姓名查找,【返回一个对象】
            Console.WriteLine(p.FindAll(r => r.Name == "庞统")[0].ToString());//根据姓名查找,返回所有匹配对象
           
            Console.WriteLine("==============");

            //=============================排序
            p.Sort();//没有参数的sort,person必须实现IComparable<T>接口,倒序
            p.Sort(new SortPerson(PersonType.Money));//倒序
            p.Sort((x, y) => x.Money.CompareTo(y.Money));//正序

            //=============================访问元素(for,foreach)
            //p.ForEach(Console.WriteLine);//委托Console.WriteLine显式每一项的值
            p.ForEach(r => Console.WriteLine(r));//使用lambda表达式
            //foreach (var item in p)
            //{
            //    Console.WriteLine(item.ToString());
            //}

            //=============================强制转换
            List<Student> stu = p.ConvertAll(r => new Student(r.Name));
            stu.ForEach(Console.WriteLine);

            Console.ReadKey();
        }

        private static bool HandleAction(Person p)
        {
            Console.WriteLine(p.Name);
            return true;
        }
    }
    //用于比较
    class FindPreson : IEquatable<Person>
    {
        private string Name;
        public FindPreson(string name)
        {
            this.Name = name;
        }
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
        public override bool Equals(object obj)
        {
            if (obj == null) throw new ArgumentException("对象不能为空");
            return Equals(obj as Person);
        }
        public bool Equals(Person other)
        {
            if (other == null) throw new ArgumentException("对象不能为空");
            return this.Name == other.Name;
        }
    }
    //用于排序
    enum PersonType
    {
        Name,
        Money
    }
    class SortPerson:IComparer<Person>
    {
        
        PersonType pt;
        public SortPerson(PersonType p)
        {
            pt = p;
        }
        public int Compare(Person x, Person y)
        {
            if (x == null || y == null) throw new ArgumentException("对象不能为null");
            int source = 0;
            switch (pt)
            { 
                case PersonType.Money:
                    source = y.Money.CompareTo(x.Money);//降序
                    break;
                case PersonType.Name:
                    source = y.Name.CompareTo(x.Name);//降序
                    break;
                default:
                     source = y.Money.CompareTo(x.Money);//降序
                    break;
            }
            return source; 
        }
    }
}
时间: 2024-12-18 06:54:30

List集合详解的相关文章

C# 集合详解 (适合新手)

System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表.队列.位数组.哈希表和字典)的集合.System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能.System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典.位向量以及只包含字符串的集合. 在System.Collections命名空间中

Java集合详解6:TreeMap和红黑树

Java集合详解6:TreeMap和红黑树 初识TreeMap 之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增.删.改.查,从存储角度考虑,这两种数据结构是非常优秀的.另外,LinkedHashMap还额外地保证了Map的遍历顺序可以与put顺序一致,解决了HashMap本身无序的问题. 尽管如此,HashMap与LinkedHashMap还是有自己的局限性----它们不具备统计性能,或者说它们的统计性能时间复杂度并不是很好才

Java集合详解2:LinkedList和Queue

Java集合详解2:LinkedList和Queue 今天我们来探索一下LinkedList和Queue,以及Stack的源码. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 喜欢的话麻烦star一下哈 文章首发于我的个人博客: https://h2pl.github.io/2018/05/09/collection2 更多关于Java后端学习的内容请到我的CSDN博客上查看:https://blog.csdn.net/a724888 我的个

Java集合详解7:HashSet,TreeSet与LinkedHashSet

Java集合详解7:HashSet,TreeSet与LinkedHashSet 今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合使用味道更佳. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl.github.io/2018/05/12/colle

Java集合详解5:深入理解LinkedHashMap和LRU缓存

Java集合详解5:深入理解LinkedHashMap和LRU缓存 今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl.github.io/2018/05/11/collection5 更多关于Java后端学习的内容请到我的CSDN博客上查看:https://blog.csdn.net

Java集合详解3:Iterator,fail-fast机制与比较器

Java集合详解3:Iterator,fail-fast机制与比较器 今天我们来探索一下LIterator,fail-fast机制与比较器的源码. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 喜欢的话麻烦star一下哈 文章首发于我的个人博客: https://h2pl.github.io/2018/05/9/collection3 更多关于Java后端学习的内容请到我的CSDN博客上查看:https://blog.csdn.net/a72

Java集合详解4:HashMap和HashTable

Java集合详解4:HashMap和HashTable 今天我们来探索一下HashMap和HashTable机制与比较器的源码. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 喜欢的话麻烦star一下哈 文章首发于我的个人博客: https://h2pl.github.io/2018/05/10/collection4 更多关于Java后端学习的内容请到我的CSDN博客上查看:https://blog.csdn.net/a724888 我的个

Java集合详解6:这次,从头到尾带你解读Java中的红黑树

<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star.fork哈 文章首发于我的个人博客: www.how2playlife.com 什么是红黑树 首先,什么是红黑树呢? 红黑树是一种"平衡的"二叉查找树,它是一种经典高效的算法,能够保证

集合详解之 Collection

集合详解之 Collection 先来看看集合的继承关系图,如下图所示: 其中: 外框为虚线的表示接口,边框为实线的表示类: 箭头为虚线的表示实现了接口,箭头为实线的表示继承了类. 为了方便理解,我隐藏了一些与本文内容无关的信息,隐藏的这些内容会在后面的章节中进行详细地介绍. 从图中可以看出,集合的根节点是 Collection,而 Collection 下又提供了两大常用集合,分别是: List:使用最多的有序集合,提供方便的新增.修改.删除的操作: Set:集合不允许有重复的元素,在许多需要

集合详解之 Map

集合详解之 Map + 面试题 集合有两个大接口:Collection 和 Map,本文重点来讲解集合中另一个常用的集合类型 Map. 以下是 Map 的继承关系图: Map 简介 Map 常用的实现类如下: Hashtable:Java 早期提供的一个哈希表实现,它是线程安全的,不支持 null 键和值,因为它的性能不如 ConcurrentHashMap,所以很少被推荐使用. HashMap:最常用的哈希表实现,如果程序中没有多线程的需求,HashMap 是一个很好的选择,支持 null 键