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

在没有 LINQ 的情况下按字符串属性对列表进行分组

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.63/5 (7投票s)

2010年9月23日

CPOL

2分钟阅读

viewsIcon

38397

downloadIcon

270

在没有 LINQ 的情况下,根据列表中对象的字符串属性对列表进行分组。

引言

在我的工作中,我经常会为一家公司工作,这家公司希望使用 .NET Framework,但似乎落后于当前趋势 1-2 年。例如,由于兼容性原因,一些公司无法使用 .NET 3.0,或者由于财务原因,无法使用 Visual Studio 2005。这意味着没有 LINQ,等等。

在没有 LINQ 的情况下,对集合执行 LINQ 使操作变得容易的操作会很痛苦。例如,LINQ 使得从对象泛型列表中提取分组的列表集合非常简单。如果没有它,则必须使用反射来保持分组操作的通用性,并且不必了解 List 中的对象。

这是一个通用的 List 类,它继承自 List<T>,允许对列表中包含的对象的属性进行分组,而无需 LINQ。如果您的公司有此类限制,这可以帮助您在 List 上执行分组,而无需升级您的 .NET Framework 版本。

目前,List 仅支持对 String 属性进行分组。

背景

之所以出现这种情况,是因为我们需要通过对原始 List 的对象的属性进行分组来提取 Lists List ,而无需使用 LINQ 或 .NET 3.0 以上的版本。目前仅可以对 Strings 进行分组,但很快将扩展到包含任何对象。

Using the Code

要使用列表,请使用其无参数构造函数进行实例化,或将 IEnumerable<T> 传递给构造函数,以使用现有的 List 进行初始化。

List 初始化并具有内容之后,调用 GroupOnString 方法以获取一个 List ,该 List 由指定的属性分组。

List<MyCustomObject> list = GetMyList(); //This grabs me a list of my custom objects
GroupingList<MyCustomObject> groupinglist = new GroupingList<MyCustomObject>(list);
List<List<MyCustomObject>> mylist = groupinglist.GroupOnString("MyProperty");  

现在您有了一个 List<List<MyCustomObject>>,其中每个 List<MyCustomObject> 都按指定的属性分组。

list 还包含一种用于通过调用 GetUniqueList 方法来检索您指定为 List<String> 的属性的唯一值列表的方法。

List<MyCustomObject> list = GetMyList(); 	//This grabs me a list of my custom objects
GroupingList<MyCustomObject> groupinglist = new GroupingList<MyCustomObject>(list);

List<String> uniqueList = groupinglist.GetUniqueList("MyProperty");

结果是一个 List<String>,它包含给定属性的唯一值列表。

工作原理

该类首先搜索提供给它的列表,以收集您指示其分组的属性的唯一值列表。例如,如果您想对属性“WarehouseName”进行分组,该列表将首先收集所有唯一的“WarehouseName”值。

一旦它有了这个唯一列表,该列表将再次搜索该列表,并为“WarehouseName”的每个值创建一个新的 List<T>。然后,它将所有具有匹配“WarehouseName”的对象添加到新列表中,并为“WarehouseName”的每个唯一值执行此操作。完成后,它将返回一个 List<List<T>>,这只是您新分组的列表的集合。

该类使用反射来执行此操作,因此不需要使用 LINQ 或 .NET 2.0 以上的版本。

历史

  • 1.0 - 初始修订
© . All rights reserved.