65.9K
CodeProject 正在变化。 阅读更多。
Home

可在各种类型之间工作的通用相等比较器库

starIconstarIconstarIconstarIconstarIcon

5.00/5 (8投票s)

2013年11月13日

CPOL

4分钟阅读

viewsIcon

21793

downloadIcon

270

可以轻松执行相等比较操作的扩展方法库。

引言

IEnumerable 接口本身提供了足够的方法和重载,后来 .NET 3.5 通过扩展方法添加了大量增强功能。只有极少数情况下,程序员才需要亲自动手创建一些无论是在业务还是领域开发中都可用的东西。

大多数时候,当我们对 IEnumerable 集合执行操作时,我们处理的是相同的对象类型,或者我过去的生活就是这样?总之,最近我开始看到很多需要我使用不同类型来比较或获取对象实例的情况。例如:在一个建筑空间集合中搜索/获取员工的位置详细信息,我手里有位置集合和员工对象,我希望能做到像 lstLocation.Exists(employ) 这样的事情。

背景  

在此库之前,当我遇到这种情况时,我别无选择,只能放弃任何内置方法或 LINQ 功能,然后编写一个循环来显式比较对象。有时 LINQ 在这里有所帮助,但之后我不得不为这么简单的任务而处理 LINQ 结果的集合。所以后来我决定编写一个可以轻松为我完成操作的扩展方法,我在这里分享。我发现这些方法在处理 LINQ 生成的匿名对象时非常有用,因为原始值无法再用于任何操作。

演示/结果屏幕

使用代码

只需将已编译的程序集或类库项目添加到您的解决方案中,扩展方法就会出现在所有实现 IEnumerable 的实例中。请参考下文的方法签名。

代码的快速概览

我不想在文章中提供完整的代码,以免文章过长和乏味。何不提供一些简短的叙述,让您下载代码并查看其运行情况?

项目 1:System.Collections.GlobalEquality 

该库包含四个模块。

  1. GenericEqualityComparer<T>:我不声明此模块的所有权。本质上,这就是我开始新库的地方。它作为全局比较器,用于处理与集合相同实例类型的比较。此类可帮助您使用虚拟对象,避免为每种情况编写相等比较器。但这仅在处理相同类型时有效。只需使用此类来创建比较器实例,即可在 .NET Framework 要求将 IEqualityComparer 传递给集合的地方。
  2. Eg: new GenericEqualityComparer<Artist>((x, y) => { return
    x.ID == y.ID; })  
  3. IEqualityComparer<in Source, in Destination>:基本接口,以防有人需要进一步扩展。
  4. GenericEqualityComparer<Source, Destination>:这是该库的核心,它允许比较两种类型的对象。扩展方法已在库本身中提供,并使用此类。在大多数情况下,您不需要直接使用此类;只需使用扩展方法即可。是的,如果您考虑扩展这些类或添加更多扩展方法,您绝对需要利用这个类。
  5. Extensions:此类的方法将作为扩展方法添加到所有 IEnumerable 实例中。
    1. Contains = 使用外部引用和条件确定指定对象是否存在于源集合中。包含两个重载。
    2. albums.Contains(artists[0], (x, y) => { return x.ArtistID == y.ID; }) 
    3. GetItemBy = 通过提供的比较器比较任何给定对象,并从源集合中返回匹配的对象。包含两个重载。
    4. albums.GetItemBy(artists[0], (x, y) => { return x.ArtistID == y.ID; }).AlbumName 
    5. IndexOfBy = 通过提供的比较器比较任何给定对象,并从源集合中返回匹配的对象。包含两个重载。
    6. albums.IndexOfBy(artists[0], (x, y) => { return x.ArtistID == y.ID; })
    7. Any = 确定源集合中是否存在任何指定的对象。包含两个重载。
    8. albums.Any(artists, (x, y) => { return x.ArtistID == y.ID; }) 
    9. All = 确定源集合中是否包含所有指定的对象。包含两个重载。
    10. albums.All(artists, (x, y) => { return x.ArtistID == y.ID; })  
    11. Except = 通过使用指定的 IEqualityComparer 生成两个序列的差集。包含两个重载。
    12. albums.Except(artists, (x, y) => { return x.ArtistID == y.ID; })

项目 2:GenericEqualityTest

此解决方案还包含一个测试模块,其结果显示在上面的屏幕截图中。它由三个类组成。

  1. Program – 主演示
  2. Artist – 用于创建集合的支持类
  3. Album – 用于创建集合的支持类

下载完整的库和演示源代码。为改进和错误添加注释。

历史 

  • 基础版本。
© . All rights reserved.