如何使用.NET 2.0查找已排序列表<t>中的所有项目?

时间:2016-04-22 11:23:55

标签: c# .net .net-2.0

如何查找已排序集合中的所有项目?

基本上我有一个List<T>集合(大集合)。首先,我想对它进行排序,以便后续查找所有匹配的调用可以尽快执行。我想使用一些内置机制而不是执行手动搜索。

我最初使用FindAll,但这可能会枚举整个集合,我需要加快速度。

必须在 .NET 2.0

下完成

修改

  1. 我有一个集合:List<Custom>
  2. 自定义是一个包含3个public字段的类(它是一个容器)

    1. 然后我对它进行排序:

      collection.Sort((x, y) => x.Id.CompareTo(y.Id)); // Id是Guid

    2. 现在我需要通过Id查找集合中的所有项目 枚举集合中的所有项目。

4 个答案:

答案 0 :(得分:2)

自.NET 2.0以来,

IEqualityComparer<T>IEquatable<T>接口已经可用,并且此框架版本引入了generic dictionariesDictionary<TKey, TValue>

您可以做的是索引。例如,如果您希望在固定时间内通过ID 获取对象,除了将它们添加到列表中之外,您还可以将它们添加到Dictionary<Guid, Custom>

现在你可以在一个恒定的时间内通过id获取对象:

Custom custom = all[someGuid];

此类方法可以遵循其他类属性。

为什么我已经谈过IEqualityComparer<T>IEquatable<T>?因为如果整个属性之一是另一个自定义类,那么您可能需要实现一个所谓的接口(和/或覆盖Object.EqualsObject.GetHashCode)来实现自定义相等,所以字典键将是唯一的。

如果您想组合多个属性,可能需要定义一个类来提供一个或多个属性:

public class Args
{
    public CustomA CustomA;
    public CustomB CustomB; 
}

...您可以为IEqualityComparer<T>实现Args以提供组合哈希码,并且能够使用Args作为词典键。这就像在寻找一个匹配给定Args实例中所有提供的属性的对象...(即在where子句中使用&&运算符...)。

答案 1 :(得分:1)

您是否尝试从Collections命名空间中排序?尝试提供Comparer。

List.Sort Method () .NET Framework 2.0

答案 2 :(得分:1)

为什么不使用2D数组而不是排序列表,其中第一个维度是GUID?

OR

对列表进行排序,使用IndexOf获取GUID的第一个索引。然后,使用RemoveRange删除索引之前的所有项目。最后,在剩余范围内使用Find来获取与GUID不匹配的第一个GUID。

答案 3 :(得分:0)

见这里:LINQ support on .NET 2.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的计算机上运行良好。非常聪明