[英]How to find all items in a sorted List<T> using .NET 2.0?
如何找到已排序集合中的所有项目?
基本上我有一个List<T>
集合(大一个)。 首先,我想对它进行排序,以便可以尽快执行随后的查找所有匹配项的调用。 我想使用一些内置机制,而不是执行手动搜索。
我最初使用的是FindAll
但是可能会枚举整个集合,因此我需要加快速度。
它必须在.NET 2.0下完成
编辑
List<Custom>
Custom是具有3个public
字段的类(它是一个容器)
然后我对其进行排序:
collection.Sort((x, y) => x.Id.CompareTo(y.Id));
// Id是Guid
现在,我需要按ID查找集合中的所有项目,而无需枚举集合中的所有项目。
从.NET 2.0开始, IEqualityComparer<T>
和IEquatable<T>
接口就已经可用,并且此框架版本引入了通用词典 : 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;
}
...并且您可以为Args
实现IEqualityComparer<T>
,以提供组合的哈希码,并能够将Args
用作字典键。 这就像在一个给定的Args
实例中寻找匹配所有提供的属性的对象一样(例如,在where子句中使用&&
运算符...)。
您是否尝试过从Collections名称空间排序? 尝试提供比较器。
为什么不使用2D数组而不是排序列表(第一个维度是GUID)呢?
要么
对列表进行排序,使用IndexOf获取GUID的第一个索引。 然后,使用RemoveRange删除索引之前的所有项目。 最后,在剩余范围内使用“查找”以获取第一个与您的GUID不匹配的GUID。
参见此处: .NET 2.0上的LINQ支持
我能想到的最简单的方法是使用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的多目标功能结合使用时,便可以编写对对象(不是XML或SQL)执行LINQ的代码,但可以在仅安装.NET Framework 2.0的计算机。 非常聪明
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.