泛型集合

一、List 泛型

        List泛型相当于动态数组,对数据类型有严格要求,主要操作如下:

    List<Student> list = new List<Student>() {
        new Student(101, "mi"),
        new Student(102, "小美"),
        new Student(103,"小咪")};
    // 返回序列中的最后一个元素;如果序列中不包含任何元素,则返回默认值
    Student stu = list.LastOrDefault<Student>();
    // 输出结果: ID: 103,Name: 小咪
    stu.Show();

    public class Student
    {
        private int ID;
        private string Name;
        public Student(int id,string name)
        {
            this.ID = id;
            this.Name = name;
        }
        public void Show()
        {
            Console.WriteLine($"ID: {ID},Name: {Name}");
        }
    }

1.Add()方法

2.Remove(item) //移除特定对象的第一个匹配项

3.RemoveAt(index) //移除指定索引处的元素

4.Insert(index,item) //在指定索引处插入元素

    List<string> list = new List<string>();
    list.Add("小美");
    list.Add("小玲");
    list.Add("赛丽亚");
    //移除特定对象的第一个匹配项
    list.Remove("小玲");
    //移除指定索引处的元素
    list.RemoveAt(1);
    //在指定索引处插入元素
    list.Insert(1, "晓彤");
        
    foreach (var item in list)
    {
        Console.WriteLine(item);
    }

二、泛型字典 Dictionary<Key,Value>键/值对

1.Add(Key,Value)方法
2.Remove(Key)方法 // 移除指定键值的元素

    Dictionary<int, string> keyValues = new Dictionary<int, string>();
    keyValues.Add(101, "小美");
    keyValues.Add(102, "小霞");
    keyValues.Add(103, "小爱");
    keyValues.Remove(102);
    foreach (var item in keyValues)
    {
        Console.WriteLine(item.Key + "\t" + item.Value);
    } 

三、泛型约束(泛型类/方法约束)

        泛型约束一般用来限制待传的数据类型,一定程度上保证安全性。一般在 <T> 后跟 where T: 约束。

四种主要约束:

1.struct 不可以为 null 的类型 值类型变量永不为 null。如: bool,int,double,struct,long等

2.class 引用类型约束

3.new() 具有公共的无参数的构造函数的非抽象类型

4.自定义泛型(基类型约束、接口类型约束) (基类型约束只能有一个,需放在前面,接口类型可以有多个)

 /* 一个参数有多个约束时,new() 需放到最后
 * 多个参数可有多个约束
 */
public class GenericConstraint<T> where T : struct
//public class GenericConstraint<T> where T : new()
//public class GenericConstraint<T> where T : struct
//public class GenericConstraint<T> where T : Demo,IUI,IOS
//public class GenericConstraint<T,K> 
//where T : struct
//where K : new()
{
    public void Show()
    {
        Console.WriteLine("这是泛型类");
    }
}

public class Demo
{

}
public interface IUI
{

}
public interface IUI
{

}

四、协变、逆变

/*
* 协变、逆变:
*      针对于泛型接口和泛型委托,离开了泛型接口和泛型委托就没有了意义
*      out 代表协变,in代表逆变
*   使用情况:
*      在知道自己或者别人以后有用到父类通过子类实例化,或者子类通过父类实例化的情况下可以使用in或者out关键字 
*/
// 协变
IIn_Out<int> out_Demo1 = new IN_OUT<int>();

// 逆变
IIN<int> in_Demo = new In<int>();

/// <summary>
/// 协变+逆变 
/// </summary>
public interface IDDD<out OUT, in IN>
{
    OUT Show();
    void Show1(IN II);
}

public class In<T> : IIN<T>
{
    public void Show(T t)
    {
        
    }
}

/// <summary>
/// 逆变
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IIN<in T>
{
    void Show(T t);
}

public class IN_OUT<T> : IIn_Out<T>
{
    public T Show()
    {
        return default(T);  //值类型默认返回0,引用类型默认返回null
    }
}

/// <summary>
/// 协变
/// </summary>
public interface IIn_Out<out T>
{
    T Show();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值