万金流
以码会友。 吾Q:578751655。 水平有限,轻喷,谢!
随笔 - 189,  文章 - 0,  评论 - 7,  阅读 - 14万

学习也是做买卖,归根到底还是学习成本的问题。

下面把微软集合类型的增删改查稍微罗列一下,大家看看它能带来的便利,和你要学的新东西,还有风险(纯粹的数据操作,不用框架,风险其实不大)相比,是否值得。来决定是跳过,还是了解,还是精研。(建议敲一遍了解一下,以后写的东西如果频繁遇到数据的小操作,可以回来翻翻,研究研究,多个选择)

1、增删改查

复制代码
 1 var a = new List<Person>();
 2             Person user;
 3             a.Add(new Person() { Name = "zs", Nl = 20 });
 4             a.Add(new Person() { Name = "ls", Nl = 18 });
 5             a.Add(new Person() { Name = "ww", Nl = 19 });
 6             user = (from x in a where x.Name == "zs" select x).Single();
 7             ////a.Remove(user);
 8             //user.Nl=25;
 9 
10             foreach (var item in a)
11             {
12                 Console.WriteLine(item.Name + "\t" + item.Nl);
13 
14             }
15             Console.ReadKey();
复制代码

说明:

  (1)第6行括号里是一种微软筛选数据的语法,叫做Linq。Linq还是有点东西的,绝不像例子里写的那么简单。有关这种语法,可以自己搜着看看,了解一下。

  (2)single方法的作用是,从集合(由一条完全相同的记录重复构成)中转化出一条记录,有点像类型转换,从多条变一条。如果原集合含有多条不相同的数据,则报错。

  (3)第7行会删除查到的数据,第8行会修改查到的数据。如果是真正的数据模型,记得要用savechanges存入库。

  (4)批量删除可以用RemoveAll方法,和lambda表达式一起用。

  (5)批量修改可以用下面的代码:

1 var guys = from x in a where x.Nl > 18 select x;
2             foreach (var item in guys)
3             {
4                 item.Nl++;
5             }

2、不用Linq,这一系列有些扩展方法,比如:

      Where,Max,Select,Sum,Any,Average,All,Concat等

      都是针对IEnumerable的对象进行扩展的

      也就是说,只要实现了IEnumerable接口,就可以使用这些扩展方法(List和Dbset都实现了的)

      来看看这段代码:      

List<int> arr = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };
var result = arr.Where(a => { return a > 3; }).Sum();
Console.WriteLine(result);
Console.ReadKey();

       这段代码中,用到了两个扩展方法。

      <1>

        Where扩展方法,需要传入一个Func<int,bool>类型的泛型委托

        这个泛型委托,需要一个int类型的输入参数和一个布尔类型的返回值

        我们直接把a => { return a > 3; }这个lambda表达式传递给了Where方法

        a就是int类型的输入参数,返回a是否大于3的结果。

      <2>

        Sum扩展方法计算了Where扩展方法返回的集合的和。

另外的例子:

复制代码
var a = new List<Person>();
            a.Add(new Person() { Name = "zs", Nl = 200 });
            a.Add(new Person() { Name = "ls", Nl = 18 });
            a.Add(new Person() { Name = "ww", Nl = 19 });
            var result = a.Where(b => b.Nl > 18).Select(b=>b.Nl).Sum();//所有人18岁以上的人,年龄求和。
            Console.WriteLine(result);
            Console.WriteLine(a.Any(x => x.Nl < 20));// 如果集合中有任何一个元素满足该条件就返回true
            Console.WriteLine(a.Where(b => b.Nl > 18).All(x=>x.Nl < 20));// 如果集合中所有元素都满足该条件,返回true
            foreach (var item in a.Where(b => b.Nl > 18).Concat(a))//Concat用来连接两个集合
            {
                Console.WriteLine(item.Name + "\t" + item.Nl);
            } 
            Console.ReadKey();
复制代码

可以自己运行一下,看看效果。

需要注意的是,any的用法以上面的注释为准,vs的提示(所有元素都满足条件才返回true)是错的。


对于常见的数据库联合查询,如:
表a
xh,xm
表b
xh,nl
对应的sql语句为:select a.xh,a.xm,b.nl from a,b where a.xh=b.xh
利用c#的list也可以完成类似功能。
基础类
xsxm

复制代码
class Xsxm
    {
        public string Xh { get; set; }
        public string Xm { get; set; }
        public static IEnumerable<Xsxm> get_xsxms()
        {
            for (int i = 1; i <=5; i++)
            {
                yield return new Xsxm() { Xh = "0" + i,Xm="a"+i };
            }
        }
    }
复制代码

xsnl:

复制代码
class Xsnl
    {
        public string Xh { get; set; }
        public int Nl { get; set; }
        public static IEnumerable<Xsnl> get_xsnls()
        {
            for (int i = 1; i <= 5; i++)
            {
                yield return new Xsnl() { Xh = "0" + i,Nl=20 + i };
            }
        }
    }
复制代码

主程序:

static void Main(string[] args)
        {
            var a =new List<Xsxm>(Xsxm.get_xsxms());
            var b =new List<Xsnl>(Xsnl.get_xsnls());
            a.ForEach(x => Console.WriteLine($"{x.Xh},{x.Xm},{b.Find(xx=>xx.Xh==x.Xh).Nl}"));
        }

 运行效果:

 

posted on   万金流  阅读(570)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

点击右上角即可分享
微信分享提示