背景
在前几天介绍的 如何利用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);
});
});
![](https://img.haomeiwen.com/i3648525/1435d42d11409411.png)
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);
});
});
![](https://img.haomeiwen.com/i3648525/dedc378edd8fb920.png)
总结
通过上面的例子,给大家演示了 GrouBy
方法的使用,该方法在实际项目中也有非常重要的应用。比如在一些继电保护的系统中,保护动作的数据集可以按照“保护类型”、“生产厂家”、“运行年限”、“电压等级”进行统计,应用GroupBy
扩展方法,可以避免对数据库的频繁查询,提升系统的运行效率。
![](https://img.haomeiwen.com/i3648525/40860cab467809ae.png)
好了!今天就到这里了,我是程序员老马,有空的时候大家聊聊人生!See You!
相关图文:
- 扩展方法(一):扩展方法概述
- 扩展方法(二):扩展方法的实现与调用
- 扩展方法(三):为枚举类型创建方法
- 扩展方法(四):在编译时绑定扩展方法的规则
- Lambda表达式(一):引出
- Lambda表达式(二):C#常用委托
- Lambda表达式(三):LINQ初步
- Lambda表达式(四):Lambda表达式与Expression树
- 如何利用 C# 实现 K 最邻近算法?
- 如何利用 C# 实现 K-D Tree 结构?
- 如何利用 C# + KDTree 实现 K 最邻近算法?
- 如何利用 C# 对神经网络模型进行抽象?
- 如何利用 C# 实现神经网络的感知器模型?
- 如何利用 C# 实现 Delta 学习规则?
- 如何利用 C# 爬取带 Token 验证的网站数据?
- 如何利用 C# 向 Access 数据库插入大量数据?
- 如何利用 C# 开发「桌面版百度翻译」软件!
- 如何利用 C# 开发「股票数据分析软件」(上)
- 如何利用 C# 开发「股票数据分析软件」(中)
- 如何利用 C# 开发「股票数据分析软件」(下)
- 如何利用 C# 爬取「财报说」中的股票数据?
- 如何利用 C# 爬取 One 持有者返利数据!
- 如何利用 C# 爬取Gate.io交易所的公告!
- 如何利用 C# 爬取BigOne交易所的公告!
- 如何利用 C# 爬取 ONE 的交易数据?
网友评论