如何查找已排序集合中的所有项目?
基本上我有一个List<T>
集合(大集合)。首先,我想对它进行排序,以便后续查找所有匹配的调用可以尽快执行。我想使用一些内置机制而不是执行手动搜索。
我最初使用FindAll
,但这可能会枚举整个集合,我需要加快速度。
必须在 .NET 2.0
下完成修改
List<Custom>
自定义是一个包含3个public
字段的类(它是一个容器)
然后我对它进行排序:
collection.Sort((x, y) => x.Id.CompareTo(y.Id));
// Id是Guid
现在我需要通过Id查找集合中的所有项目 枚举集合中的所有项目。
答案 0 :(得分:2)
IEqualityComparer<T>
和IEquatable<T>
接口已经可用,并且此框架版本引入了generic dictionaries:Dictionary<TKey, TValue>
。
您可以做的是索引。例如,如果您希望在固定时间内通过ID 获取对象,除了将它们添加到列表中之外,您还可以将它们添加到Dictionary<Guid, Custom>
。
现在你可以在一个恒定的时间内通过id获取对象:
Custom custom = all[someGuid];
此类方法可以遵循其他类属性。
为什么我已经谈过IEqualityComparer<T>
和IEquatable<T>
?因为如果整个属性之一是另一个自定义类,那么您可能需要实现一个所谓的接口(和/或覆盖Object.Equals
和Object.GetHashCode
)来实现自定义相等,所以字典键将是唯一的。
如果您想组合多个属性,可能需要定义一个类来提供一个或多个属性:
public class Args
{
public CustomA CustomA;
public CustomB CustomB;
}
...您可以为IEqualityComparer<T>
实现Args
以提供组合哈希码,并且能够使用Args
作为词典键。这就像在寻找一个匹配给定Args
实例中所有提供的属性的对象...(即在where子句中使用&&
运算符...)。
答案 1 :(得分:1)
您是否尝试从Collections命名空间中排序?尝试提供Comparer。
答案 2 :(得分:1)
为什么不使用2D数组而不是排序列表,其中第一个维度是GUID?
OR
对列表进行排序,使用IndexOf获取GUID的第一个索引。然后,使用RemoveRange删除索引之前的所有项目。最后,在剩余范围内使用Find来获取与GUID不匹配的第一个GUID。
答案 3 :(得分:0)
我能想到的最简单方法是使用Linq:
错误的方式
List<Order> objListOrder = new List<Order>();
GetOrderList(objListOrder); // fill list of orders
正确的方式
List<Order> SortedList = objListOrder.OrderBy(o=>o.OrderDate).ToList();
将LINQ与.NET Framework 2.0一起使用
LINQBridge(来自优秀LINQPad的作者)是一个小型的60KB程序集,结合Visual Studio 2008的多目标功能,可以编写执行LINQ to Objects(不是XML或SQL)但在安装了.NET Framework 2.0的计算机上运行良好。非常聪明