在.NET3.5及以后的版本中,引入了大量的扩展方法,极大地丰富了处理集合时的能力。通常情况下,开发者很少需要手动编写代码来实现跨应用程序的通用功能,无论这些应用程序属于哪个业务或领域。然而,有时候确实需要对不同类型的对象进行比较或获取实例,例如在处理一个建筑物空间集合时查找员工的位置信息,这时可能会希望有一种方法能够简化这一过程。
在没有这个库之前,遇到这种情况,通常只能放弃内置方法或LINQ工具,转而编写循环来显式比较对象。有时LINQ能够帮助,但处理LINQ结果的集合时,可能会遇到一些困难。因此,决定编写一个扩展方法来简化这一操作,这里将分享这个方法。发现这些方法在处理LINQ生成的匿名对象时特别有用,因为原始值在操作中无法使用。
要使用这段代码,只需将编译后的程序集或类库项目添加到解决方案中,扩展方法就会出现在所有实现了IEnumerable的实例中。下面提供了方法签名的快速概览。
不想在文章中展示完整的代码,以免文章变得冗长乏味。让通过简短的叙述,然后下载代码并运行它。
这个库由四个模块组成:
Contains: 确定指定对象是否在源集合中,使用外部引用和条件。包含两个重载。
albums.Contains(artists[0], (x, y) => {
return x.ArtistID == y.ID;
});
GetItemBy: 通过提供的比较器比较任何给定的对象,并从源集合中返回匹配的对象。包含两个重载。
albums.GetItemBy(artists[0], (x, y) => {
return x.ArtistID == y.ID;
}).AlbumName
IndexOfBy: 通过提供的比较器比较任何给定的对象,并从源集合中返回匹配的对象。包含两个重载。
albums.IndexOfBy(artists[0], (x, y) => {
return x.ArtistID == y.ID;
});
Any: 确定源集合中是否有任何指定的对象。包含两个重载。
albums.Any(artists, (x, y) => {
return x.ArtistID == y.ID;
});
All: 确定源集合中的所有指定对象是否可用。包含两个重载。
albums.All(artists, (x, y) => {
return x.ArtistID == y.ID;
});
Except: 通过使用指定的IEqualityComparer生成两个序列的集合差。包含两个重载。
albums.Except(artists, (x, y) => {
return x.ArtistID == y.ID;
});
这个解决方案还包括一个测试模块,它由三个类组成: