C# GroupBy重构:处理多属性Key及相等判断问题
45 浏览量
更新于2024-08-28
收藏 70KB PDF 举报
本文主要介绍了C#中`GroupBy`操作的基本使用,特别是在代码重构时遇到的问题及其解决方案。
在C#编程中,`GroupBy`是LINQ(Language Integrated Query)的一个重要方法,用于根据一个或多个指定的键对数据进行分组。在描述的场景中,开发人员在重构代码时遇到了关于`GroupBy`使用匿名类型作为键的问题。原始的`GroupBy`调用如下:
```csharp
var groups = data.GroupBy(m => new { m.PropertyA, m.PropertyB });
```
在这个例子中,`data`集合中的每个元素通过`PropertyA`和`PropertyB`的组合被分组。然而,当需要将`groups`传递给其他方法时,无法使用`var`进行类型推导,因此需要明确指定其类型。`GroupBy`的结果是一个`IEnumerable<IGrouping<TKey, TSource>>`,其中`TSource`是源数据类型,而`TKey`是分组键的类型。
为了重构,开发者创建了一个名为`EntityKey`的类来承载`PropertyA`和`PropertyB`,并尝试像这样使用它:
```csharp
class EntityKey
{
public int PropertyA { get; set; }
public string PropertyB { get; set; }
}
var groups = data.GroupBy(m => new EntityKey { PropertyA = m.PropertyA, PropertyB = m.PropertyB });
```
不幸的是,这样做导致了错误的结果,每个分组只包含原始数据的一个元素。这是因为匿名类型的相等比较基于对象引用,而不是属性值。在`EntityKey`类中没有重写`Equals`和`GetHashCode`方法,所以默认的相等检查失败,每个实例被视为不同,从而每个元素都形成了单独的分组。
为了解决这个问题,我们需要确保`EntityKey`类正确地实现了相等比较。这通常意味着重写`Equals`和`GetHashCode`方法,以基于`PropertyA`和`PropertyB`的值来比较实例:
```csharp
class EntityKey
{
public int PropertyA { get; set; }
public string PropertyB { get; set; }
public override bool Equals(object obj)
{
if (obj is EntityKey other)
{
return PropertyA == other.PropertyA && PropertyB == other.PropertyB;
}
return false;
}
public override int GetHashCode()
{
unchecked
{
var hash = 17;
hash = hash * 23 + PropertyA.GetHashCode();
hash = hash * 23 + PropertyB.GetHashCode();
return hash;
}
}
}
```
现在,当使用`EntityKey`实例作为`GroupBy`的键时,相等性和哈希码计算基于属性值,将产生正确的分组结果。
总结,`C#`中的`GroupBy`操作是数据处理的关键部分,正确处理键类型(尤其是自定义类型)的相等性和哈希码至关重要。在使用匿名类型或者自定义类型作为键时,确保它们遵循适当的相等比较规则,以保证`GroupBy`能够正确分组。在遇到类似问题时,检查`Equals`和`GetHashCode`方法的实现是排查问题的关键步骤。
2020-12-31 上传
2020-08-28 上传
2011-04-29 上传
2009-08-23 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38562626
- 粉丝: 3
- 资源: 937
最新资源
- NIST REFPROP问题反馈与解决方案存储库
- 掌握LeetCode习题的系统开源答案
- ctop:实现汉字按首字母拼音分类排序的PHP工具
- 微信小程序课程学习——投资融资类产品说明
- Matlab犯罪模拟器开发:探索《当蛮力失败》犯罪惩罚模型
- Java网上招聘系统实战项目源码及部署教程
- OneSky APIPHP5库:PHP5.1及以上版本的API集成
- 实时监控MySQL导入进度的bash脚本技巧
- 使用MATLAB开发交流电压脉冲生成控制系统
- ESP32安全OTA更新:原生API与WebSocket加密传输
- Sonic-Sharp: 基于《刺猬索尼克》的开源C#游戏引擎
- Java文章发布系统源码及部署教程
- CQUPT Python课程代码资源完整分享
- 易语言实现获取目录尺寸的Scripting.FileSystemObject对象方法
- Excel宾果卡生成器:自定义和打印多张卡片
- 使用HALCON实现图像二维码自动读取与解码