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






4.63/5 (7投票s)
在没有 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 - 初始修订