var关键字

var关键字与javascript的var关键字用法基本一致,不同点在于javascript使用var声明a赋值整型1,在把a赋值字符串"abc"这样是可以的,但是c#的var关键字不行,使用var声明a赋值1,在a赋值"abc"会报错,因为编译器会在编译时会在根据赋值的类型把var替换成对应的类型。例子:

var a = 1;//这里编译器会把a当成int变量
var b = "abc"//这里编译器会把b当成string类型


Linq

ForEach
这里有一个需求循环打印一个List对象,这个对象Student有姓名(Name)和班级(Class)两个属性,正常写法是foreach(var i in Student)……,这里提供另外一种写法foreach的linq版本

Student.ForEach(item =>
{
    console.WriteLine($"姓名:{item.Name},班级{item.Class}");
})

Where与ToList
有一个需求把Student对象里班级(Class)是3班的拿出来生成一个List列表

var studentInfo = Student.Where(item => item.Class == "3班").ToList();//Where方法筛选班级为3班的Student对象,然后使用ToList方法把他变成List列表

Select与Distinct
有一个需求只需要把Student对象里的班级(Class)属性筛选出来去重,其他多余的属性全部不要

var classList = Student.Select(item => item.Class).Distinct().ToList();//Select将元素映射到新的列表,Distinct去重操作

FirstOrDefault

返回列表中满足条件的第一个元素,有一个需求需要从城市列表cityList找到北京这个城市

var city = cityList.FirstOrDefault(item => item == "北京");

SequenceEqual
判断两个List是否相等,这个方法需要实现IEqualityComparer接口,现在有stu1和stu2两个列表,使用SequenceEqual判断他们是否相等。
实现IEqualityComparer接口

public class StudentComparer : IEqualityComparer<Student>
{
    public bool Equals(Student x, Student y)
    {
        if (x.Name == y.Name && x.Class == y.Class)//定义比较规则
        {
            return true;
        }
        return false;
    }
    public int GetHashCode(Student obj)
    {
        return obj.GetHashCode();
    }
}

使用SequenceEqual比较

var result = stu1.SequenceEqual(stu2,new StudentComparer());


switch

switch有两种写法,一种是常规写法,这里要讲的是c#8的新写法。与常规写法不同的是这种写法必须有返回值,否则会报错。

var type = x switch //根据X的值选择不同的结果
{
1 => Console.WriteLine("我是学生"),
2 => Console.WriteLine("我是老师"),
_ => Console.WriteLine("身份错误"),
};


?,?.,??的区别

?是可空类型修饰符,引用类型可以使用空引用表示一个不存在的值如string s = null,但是整型不行如int a = null这样会编译报错,但是使用?可以让值类型可空,使用方法 int? a = null可以正常编译。

?.是空检查运算符,使用此运算符可以返回为Null,如stu1?.First(),stu1这个List列表长度为0及没有元素,如果直接使用stu1.First()会抛异常,使用空检查运算符可以返回Null。

??空合并运算符,一个例子

string a = null;
string b = "a";
string c = a ?? b;//最终c的结果会"a",??运算符会检查左操作数是否为空,为空则会返回右操作数