分享

技术图文:如何通过 LINQ 查找集合中的重复数据?

 老马的程序人生 2020-08-17


背景

在前几天介绍的  如何利用C#实现Huffman编码? 的图文中有以下代码。

private List<HuffmanTreeNode> CreateInitForest(string str)
{
    if (string.IsNullOrEmpty(str))
        throw new ArgumentNullException();

    List<HuffmanTreeNode> result = new List<HuffmanTreeNode>();
    char[] charArray = str.ToCharArray();
    List<IGrouping<charchar>> lst = charArray.GroupBy(a => a).ToList();

    foreach (IGrouping<charchar> g in lst)
    {
        char data = g.Key;
        int weight = g.ToList().Count;
        HuffmanTreeNode node = new HuffmanTreeNode(data, weight);
        result.Add(node);
    }
    return result;
}

该代码实现了统计字符串 str 中不同字符出现的频数,并把这个频数作为 Huffman 树结点的权值,字符作为数据,生成对应的 Huffman 树的叶子结点。

在这篇图文发布之后,很多同学问我,针对数据集合的扩展方法 GroupBy 如何使用,我在这里给大家总结一下。


技术分析

GroupBy 从字面意义上理解就是根据 By 指定的规则对数据进行分组,所谓的分组就是将一个“数据集合”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。这里的 GroupBy 方法与 SQL 语句中的 GroupBy 功能是完全一样的。

下面,我通过例子给大家介绍GroupBy方法的应用。

Step1. 构造集合中的元素类型 Student

public class Student
{
    public string Name { getset; }
    public int Age { getset; }
    public Student(string name, int age)
    
{
        Name = name;
        Age = age;
    }
}

Step2. 构造一个Student的数据集合List<Student>

List<Student> lst = new List<Student>
{
    new Student("赵一"17),
    new Student("钱二"16),
    new Student("张三"19),
    new Student("李四"18),
    new Student("王五"16),
    new Student("刘六"17),
    new Student("刘六"19)
};

Step3. 将集合数据按照年龄分组,并把分组结果显示出来

List<IGrouping<int, Student>> sameAge
    = lst.GroupBy(a => a.Age).ToList();

sameAge.ForEach(a =>
{
    Console.WriteLine("年龄为" + a.Key + "的人为:");

    a.ToList().ForEach(b =>
    {
        Console.WriteLine(b.Name);
    });
});

输出结果

Step4. 将集合数据按照年龄分组,并把分组中包含元素大于1的显示出来

List<IGrouping<int, Student>> sameAge
    = lst.GroupBy(a => a.Age).Where(g => g.Count() > 1).ToList();

sameAge.ForEach(a =>
{
    Console.WriteLine("年龄为" + a.Key + "的人为:");
    a.ToList().ForEach(b =>
    {
        Console.WriteLine(b.Name);
    });
});

输出结果

总结

通过上面的例子,给大家演示了 GrouBy 方法的使用,该方法在实际项目中也有非常重要的应用。比如在一些继电保护的系统中,保护动作的数据集可以按照“保护类型”、“生产厂家”、“运行年限”、“电压等级”进行统计,应用GroupBy扩展方法,可以避免对数据库的频繁查询,提升系统的运行效率。

实际应用

好了!今天就到这里了,我是程序员老马,有空的时候大家聊聊人生!See You!


相关图文


经过8年多的发展,LSGO软件技术团队在「地理信息系统」、「数据统计分析」、「计算机视觉」等领域积累了丰富的研发经验,也建立了人才培养的完备体系,欢迎对计算机技术感兴趣的同学加入,与我们共同成长进步。

我们图文推送的计划如下,欢迎大家转发!

  • 周一「图书排行:计算机书籍每周销量排行榜」

  • 周二「技术分享:C#语言在工程中的应用」

  • 周三「资料分享:网络上发现的电子资料」

  • 周四「LeetCode实战:算法题目的实现

  • 周五「猫眼电影:即将上映、最受期待榜」

  • 周六「Github精选:本周10大热门项目」

  • 周日「股市币市:本周交易数据分析与最新公告」

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多