C# 基础语法 学习笔记

发布于:2024-04-17 ⋅ 阅读:(24) ⋅ 点赞:(0)

1.C#基础语法

1.1 泛型

泛型是 C# 推出的一个重要语法,泛型允许在编写方法或类是定义一些未确定的类型参数。它提供了类型安全高效的数据结构和算法,同时也可以避免装箱和拆箱操作,提高代码的复用性(编程时,出现相似的模块,这加大我们的工作量,如果使用泛型可以让多个类型共享一组代码)。

定义一个简单的泛型类定义和使用的例子:

MyGenericClass<T> 是一个泛型类,其中的类型 T 是一个类型参数。

在 Main 方法中,我们创建了两个 MyGenericClass 的实例,一个用于 int 类型,另一个用于 string 类型。这展示了泛型的一个常见用法,即用于不同数据类型的通用数据结构。

using System;
using System.Collections.Generic;

// 定义一个泛型类
public class MyGenericClass<T>
{
    private T _value;
 
    public MyGenericClass(T value)
    {
        _value = value;
    }
 
    public void DisplayValue()
    {
        Console.WriteLine(_value.ToString());
    }
}


class Program
{
    static void Main()
    {
        // 创建一个泛型类的实例,指定泛型类型参数为int
        MyGenericClass<int> intClass = new MyGenericClass<int>(10);
        intClass.DisplayValue(); // 输出: 10
 
        // 创建一个泛型类的实例,指定泛型类型参数为string
        MyGenericClass<string> stringClass = new MyGenericClass<string>("Hello World");
        stringClass.DisplayValue(); // 输出: Hello World
 
        Console.ReadKey();
    }
}

1.2 LinQ

LinQ是C#和VB中的统一查询语法,使用对象来保存和检索来自不同来源(如数据库、xml、对象集合)的数据。

主要功能消除了编程语言和数据库之间的不匹配,以及为不同类型的数据源提供统一的查询接口

适用范围:LInq适用于实现了IEnumerable <T>(IQueryable继承于IEnumerable )的实例,如:List,Dictionary,Queue,LinkedList,Array等。

linq的使用

有两种方法可以将LINQ查询写入IEnumerable集合或IQueryable数据源。

1、查询语法

特点:以from子句开头,可以以select或groupBy子句结束

2、lambda表达式(简洁且功能更多,推荐)

下边给出了简单的例子,注:后边的部分都是使用的这个测试数据。

//准备的测试数据

IList<UserInfo> userList = new List<UserInfo>() {

       new UserInfo() { UId = 1, UserName = "zs", Age = 23 ,RoleId=1} ,

       new UserInfo() { UId = 2, UserName = "ls", Age = 20 ,RoleId=2},

       new UserInfo() { UId = 3, UserName = "ww", Age = 33 ,RoleId=1},

       new UserInfo() { UId = 4, UserName = "zl", Age = 26 ,RoleId=2},

       new UserInfo() { UId = 5, UserName = "tq", Age = 42 ,RoleId=2}

        };//用户列表

            IList<RoleInfo> roleList = new List<RoleInfo>(){

                new RoleInfo(){Rid=1,RoleName="管理员"},

                new RoleInfo(){Rid=2,RoleName="普通用户"},

            };//角色列表



//query语法

 var resUsers = from u in userList

                where u.Age > 20

                select new {u.UId,u.UserName,u.Age};

//lambda

var resUsers2 = userList.Where<UserInfo>(u => u.Age > 20).Select(u => new { u.UId,u.UserName,u.Age});

linq详解

1、过滤 (where 和 oftype)

Where:根据给定的条件表达式过滤集合,并返回一个新集合

OfType:根据类型进行过滤

IList<object> list = new List<object>() { 1, "hello", user };//user是一个UserInfo的实例

//query语法

var result = from o in list.OfType<string>() select o;

//lambda语法

var result2 = list.OfType<string>();

2、排序(OrderBy,OrderByDescending,ThenBy,ThenByDescending)

//对userList先按Id排序,再按Age排序

//query语法

 var result = from u in userList

                    orderby u.Id,u.Age descending

                    select u;

//lambda语法

var result2 = userList.OrderByDescending(u => u.Id).ThenBy(u=>u.Age);

3、分组(group by,ToLookUp)

//query语法

 var resGroups = from u in userList group u by u.RoleId;

//lambda方式  注:GroupBy延迟执行,而ToLookup是立即执行的,使用方法和GroupBy一样。

var resGroups2 = userList.GroupBy(u => u.RoleId);

//遍历(group.Key为设置分组的列的值)

             foreach (var group in resGroups)

              {

                  Console.WriteLine("roleId:{0}", group.Key);

                 foreach (UserInfo user in group)

                 {

                    Console.WriteLine("UserName:{0}", user.UserName);

                 }

             }

             /*结果:  roleId:1

                     UserName:zs

                     UserName:ww

                     roleId:2

                     UserName:ls

           UserName:zl 21  UserName:tq */

    
//多列分组

    var productGroup=

        from p in db.Products

        group p by new

        {

            p.PName,

            p.PColor

        }

        into g

        select new

        {

           g.Key,//这里的key是一个对象,有两个属性:PName,PColor

           g

        };

4、连接查询(join)

//query语法,查询用户名和该用户所属的角色 inner join

var resJoin = from user in userList

              join role in roleList

              on user.RoleId equals role.Rid

              select new

              {

                   uname=user.UserName,

                   rname=role.RoleName

               };



//left join,right join调整下顺序即可

var resJoin = from user in userList

              join role in roleList

              on user.RoleId equals role.Rid into temp

          from tt in temp.DefaultIfEmpty

              select new

              {

                    uname=user.UserName,

                    rname=role?.RoleName

              };



//cross join

var resJoin = from user in userList

              from role in roleList

              select new

              {

                   uname=user?.UserName,

                   rname=role?.RoleName

              };



//lambda方式

var resJoin2 = userList.Join(roleList,

               user => user.RoleId,  //outkey

               role => role.Rid,     //innerkey

               (user, role) => new   //result

               {

                 uname = user.UserName,

                 rname = role.RoleName

               });

//遍历

foreach (var item in resJoin2)

{

      Console.WriteLine("用户:{0}----角色:{1}", item.uname, item.rname);

}

  /*结果:  用户:zs----角色:管理员

          用户:ls----角色:普通用户

          用户:ww----角色:管理员

          用户:zl----角色:普通用户

          用户:tq----角色:普通用户 */