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

背景

在前几天介绍的 如何利用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<char, char>> lst = charArray.GroupBy(a => a).ToList();

    foreach (IGrouping<char, char> 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 { get; set; }
    public int Age { get; set; }
    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!


相关图文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青少年编程备考

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值