当前位置:首页 > C#学习 > 正文内容

C# 集合数据处理的常用方法

小道5年前 (2019-01-20)C#学习7324

集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。

集合(Collection)类服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等。这些类创建 Object 类的对象的集合。在 C# 中,Object 类是所有数据类型的基类。

所有集合都实现了IEnumerable接口,在这个接口中已经有了Where方法,使用扩展方法添加自己的MyWhere方法:

using System;
using System.Collections.Generic;

namespace 集合扩展方法
{
    class Program
    {
        static void Main(string[] args)
        {

            int[] nums = { 5, 5, 6, 9, 5, 2, 3, 6, 4, 12, 15, 4, 6, 18, 2, 3, 5, 6, 4, 8 };//整型数组
            IEnumerable<int> r = nums.MyWhere(i => i > 8);//调用扩展方法,判断 i是否大于8
            foreach (var item in r)//循环
            {
                Console.WriteLine(item);//输出
            }
            string[] strs = { "今天天气很好!", "吃过饭了吗?", "今天去哪里玩?", "明天去吃火锅!", "下个月去旅游。", "钱包里还有多少钱?", "今年多大了?" };//字符串数组
            IEnumerable<string> str = strs.MyWhere(s => s.Contains("?"));//判断字符串是否包含"?"
            foreach (var item in str)//循环
            {
                Console.WriteLine(item);//输出
            }
            Console.ReadKey();
        }
    }
    static class JiHe//静态类
    {
        public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> data, Func<T, bool> func)// 扩展方法,返回 IEnumerable 类型
        {
            List<T> resultList = new List<T>();//声明泛型List
            foreach (var item in data)//循环
            {
                if (func(item))//调用Func委托,判断
                {
                    resultList.Add(item);//添加元素到List列表
                }
            }
            return resultList;//返回
        }
    }
}

生成结果:

image.png

集合常用扩展方法:

using System;
using System.Collections.Generic;
using System.Linq;

namespace 常用
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>();//列表
            list.Add(5);//添加元素
            list.Add(7);//添加元素
            list.Add(3);//添加元素
            list.Add(10);//添加元素
            list.Add(25);//添加元素
            list.Add(17);//添加元素
            list.Add(11);//添加元素

            int max = list.Max();//求最大值
            int min = list.Min();//求最小值
            int sum = list.Sum();//求总和
            double avg = list.Average();//求平均值
            Console.WriteLine("最大值: {0}\r\n最小值: {1}\r\n总和: {2}\r\n平均值: {3}\r\n",max,min,sum,avg);//输出
            Console.ReadKey();
        }
    }
}

生成结果:

image.png

集合OrderBy扩展方法:

using System;
using System.Collections.Generic;
using System.Linq;

namespace 集合OrderBy
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>();//列表
            list.Add(5);//添加元素
            list.Add(7);//添加元素
            list.Add(3);//添加元素
            list.Add(10);//添加元素
            list.Add(25);//添加元素
            list.Add(17);//添加元素
            list.Add(11);//添加元素

            IEnumerable<int> r = list.OrderBy(i => i);//降序排序
            foreach (var item in r)//循环
            {
                Console.WriteLine(item);//输出
            }
            Console.ReadKey();
        }
    }
}

生成结果:

image.png

集合自带的Where扩展方法:(对数据按照lambda表达式进行过滤)

using System;
using System.Collections.Generic;
using System.Linq;

namespace 集合Where
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>();//列表
            list.Add(5);//添加元素
            list.Add(7);//添加元素
            list.Add(3);//添加元素
            list.Add(10);//添加元素
            list.Add(25);//添加元素
            list.Add(17);//添加元素
            list.Add(11);//添加元素

            IEnumerable<int> r = list.Where(i => i > 5);//通过IEnumerable接口实现Where扩展方法,i => i > 5 是 lambda表达式
            foreach (var item in r)//循环
            {
                Console.WriteLine(item);//输出
            }
            Console.ReadKey();
        }
    }
}

生成结果:

image.png

集合自带的Select扩展方法:(对集合的数据按照lambda表达式进行处理,生成一个新的集合。集合长度一样。)

using System;
using System.Collections.Generic;
using System.Linq;

namespace 集合Select
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>();//列表
            list.Add(5);//添加元素
            list.Add(7);//添加元素
            list.Add(3);//添加元素
            list.Add(10);//添加元素
            list.Add(25);//添加元素
            list.Add(17);//添加元素
            list.Add(11);//添加元素

            IEnumerable<int> r = list.Select(i => i * 2);//将所有元素 * 2,保存到新表中,元素list表元素不变。
            foreach (var item in r)//循环
            {
                Console.WriteLine(item);//输出
            }
            Console.ReadKey();
        }
    }
}

生成结果:

image.png

First、FirstOrDefault、Single、SingleOrDefault扩展方法:

using System;
using System.Linq;

namespace 集合扩展方法1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] strs1 = { };//没有元素的数组
            string[] strs2 = { "A" };//一个元素的数组
            string[] strs3 = { "A", "B" };//大于一个元素的数组

            //string s1 = strs1.First();//抛异常,集合不能为null。
            string s2 = strs2.First();//First 获取集合中的第一个元素,如果集合中一个元素都没有,则抛异常。
            string s3 = strs3.First();//First 获取集合中的第一个元素,如果集合中一个元素都没有,则抛异常。
            Console.WriteLine("s2 获取:" + s2);//输出
            Console.WriteLine("s3 获取:" + s3);//输出

            string s4 = strs1.FirstOrDefault();//FirstOrDefault 获取集合中的第一个元素,如果集合内没有元素,则返回集合类型的默认值。
            string s5 = strs2.FirstOrDefault();
            string s6 = strs3.FirstOrDefault();
            Console.WriteLine("s4 获取:" + s4);//输出
            Console.WriteLine("s5 获取:" + s5);//输出
            Console.WriteLine("s6 获取:" + s6);//输出

            //string s7 = strs1.Single();//抛异常
            string s8 = strs2.Single();//获取集合中的唯一一个元素,如果集合中没有元素或者多余一个元素,则抛异常
            //string s9 = strs3.Single();//抛异常
            Console.WriteLine("s8 获取:" + s8);//输出

            string s10 = strs1.SingleOrDefault();//获取集合中的唯一一个元素,如果集合中没有元素则返回null。如果集合内多余一个元素,则抛异常。
            string s11 = strs2.SingleOrDefault();//获取第一个元素
            //string s12 = strs3.SingleOrDefault();//抛异常

            Console.WriteLine("s10 获取:" + s10);//输出
            Console.WriteLine("s11 获取:" + s11);//输出

            Console.ReadKey();
        }
    }
}

生成结果:

image.png

以上方法可以组合使用!

例如:

int r = list.Where(i => i > 5).Select(a=>a*2).OrderBy(o=>o).First();//获取大于5的数值,将数值 * 2,降序排列,获取第一个值。


扫描二维码推送至手机访问。

版权声明:本文由小道发布,如需转载请注明出处。

本文链接:https://www.daobk.com/post/174.html

分享给朋友:
返回列表

上一篇:C# lambda表达式学习

没有最新的文章了...

“C# 集合数据处理的常用方法” 的相关文章

if语句应用:依次提示用户输入两个整数

if语句应用:依次提示用户输入两个整数

依次提示用户输入两个整数(假设i1、i2)。如果i1、i2都是正数,则将i1的值递增一个数,然后打印i1+i2的值;如果i1、i2都是负数,则将i1的值递减10个数,然后打印i1*i2的值;如果i1、i2中任一个为0,则提示数据有错误;否则计算i1*i2的绝对值。   ...

foreach语句:依次读取数组中的元素。

foreach语句:依次读取数组中的元素。

foreach和for的区别:for可以不逐个遍历,比如每隔一个遍历一个,或者可以从后向前遍历。只能(只应该)在foreach对集合进行读,而不应该写。foreach语句:依次读取数组中的元素。         ...

字符串的处理

字符串的处理

C#中单个字符用单引号包含就是char类型,('a'),单引号中放且只能放一个字符。单个字符也可以表示为字符串,还可以有长度为0的字符串使用s.Length属性来获得字符串中的字符个数string可以看做是char的只读数组。char c = s[1];。C#中字符串有一个重要的特性...

面向对象概念

面向对象概念

面向对象不是取代面向过程的。类、对象。“人”是类,“张三”是“人”这个类的对象。类是抽象的,对象是具体的。按钮就是类,某个按钮就是对象。对象可以叫做类的实例(Instance)。类就像int,对象就像10。字段Field(和某个对象相关的变量),字段就是类的状态。人这个类有姓名、年龄、身高等字段。类...

评论列表

自媒体运营
自媒体运营 IP:河南省
2年前 (2021-11-29)

绝对干货,值得收藏!

头条新闻
头条新闻 IP:江苏省
3年前 (2021-06-01)

文章不错交个朋友

在家赚钱
在家赚钱 IP:陕西省
4年前 (2020-08-30)

已阅,感谢站长分享!

热搜
热搜 IP:
5年前 (2019-09-22)

文章本次非常喜欢,支持

头条新闻
头条新闻 IP:广西
5年前 (2019-08-06)

文章不错非常喜欢

今日新鲜事
今日新鲜事 IP:广西
5年前 (2019-06-22)

文章不错支持

新闻头条
新闻头条 IP:广西
5年前 (2019-05-26)

文章不错支持一下,非常喜欢

新闻头条
5年前 (2019-05-20)

文章不错支持一下吧,非常喜欢

头条新闻
头条新闻 IP:广西
5年前 (2019-04-10)

文章不错支持一下,非常喜欢

今日新闻
5年前 (2019-04-07)

文章不错支持一下吧

丘八
丘八 IP:江西省
5年前 (2019-02-26)

文章不错,非常喜欢

谷歌卫星地图
5年前 (2019-02-26)

SEO是一个持久性的活儿,需要不断坚持才能看到希望。

头条
头条 IP:
5年前 (2019-01-27)

文章不错非常喜欢

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。