C# 如何查找已排序列表中的所有项目<;T>;使用.NET2.0?

C# 如何查找已排序列表中的所有项目<;T>;使用.NET2.0?,c#,.net,.net-2.0,C#,.net,.net 2.0,如何查找已排序集合中的所有项目 基本上我有一个列表集合(大的)。首先,我想对它进行排序,以便可以尽可能快地执行查找所有匹配项的后续调用。我希望使用一些内置机制,而不是执行手动搜索 我最初使用的是FindAll,但这可能会枚举整个集合,我需要加快速度 它必须在.NET 2.0下完成 编辑 我有一个收藏:List Custom是一个具有3个公共字段的类(它是一个容器) 然后我把它分类: collection.Sort((x,y)=>x.Id.CompareTo(y.Id))//Id是一个Guid 现

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

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

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

它必须在.NET 2.0下完成

编辑

  • 我有一个收藏:
    List
  • Custom是一个具有3个公共字段的类(它是一个容器)

  • 然后我把它分类:

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

  • 现在,我需要按Id查找集合中的所有项目,而不需要 枚举集合中的所有项


  • 您是否尝试过从集合名称空间进行排序?尝试提供一个比较器


    是否尝试从集合名称空间排序?尝试提供一个比较器

    请参见此处:

    我能想到的最简单的方法是使用Linq:

    走错路

     List<Order> objListOrder = new List<Order>();
        GetOrderList(objListOrder); // fill list of orders
    
    List objListOrder=new List();
    GetOrderList(objListOrder);//填写订单清单
    
    正道

    List<Order> SortedList = objListOrder.OrderBy(o=>o.OrderDate).ToList();
    
    List-SortedList=objListOrder.OrderBy(o=>o.OrderDate.ToList();
    
    将LINQ与.NET Framework 2.0结合使用

    (来自优秀LINQPad的作者)是一个60KB的小程序集,当与Visual Studio 2008的多目标功能结合使用时,可以编写代码,对对象(不是XML或SQL)执行LINQ,但在安装了.NET Framework 2.0的机器上运行良好。非常聪明

    请看这里:

    我能想到的最简单的方法是使用Linq:

    走错路

     List<Order> objListOrder = new List<Order>();
        GetOrderList(objListOrder); // fill list of orders
    
    List objListOrder=new List();
    GetOrderList(objListOrder);//填写订单清单
    
    正道

    List<Order> SortedList = objListOrder.OrderBy(o=>o.OrderDate).ToList();
    
    List-SortedList=objListOrder.OrderBy(o=>o.OrderDate.ToList();
    
    将LINQ与.NET Framework 2.0结合使用


    (来自优秀LINQPad的作者)是一个60KB的小程序集,当与Visual Studio 2008的多目标功能结合使用时,可以编写代码,对对象(不是XML或SQL)执行LINQ,但在安装了.NET Framework 2.0的机器上运行良好。非常聪明

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


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

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

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

    IEqualityComparer
    IEquatable
    接口自.NET 2.0和引入此框架版本以来一直可用:
    Dictionary

    你能做的就是建立索引。例如,如果要在固定时间内按id获取对象,除了将它们添加到列表中,还可以将它们添加到
    字典中

    现在,您可以在固定时间内按id获取对象:

    Custom custom = all[someGuid];
    
    其他类属性可以遵循这种方法

    为什么我要谈论
    IEqualityComparer
    IEquatable
    ?因为如果整个属性中有一个是另一个自定义类,那么可能需要实现一个所谓的接口(和/或重写
    Object.Equals
    Object.GetHashCode
    )来实现自定义等式,因此字典键将是唯一的

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

    public class Args
    {
        public CustomA CustomA;
        public CustomB CustomB; 
    }
    
    …您可以为
    Args
    实现一个
    IEqualityComparer
    ,以提供一个组合哈希代码,并能够使用
    Args
    作为字典键。这就像在给定的
    Args
    实例中查找与所有提供属性匹配的对象一样。。。(例如,在where子句中使用
    &&
    运算符…。

    IEqualityComparer
    IEquatable
    接口自.NET 2.0以来就已经可用,并且引入了此框架版本:
    字典

    你能做的就是建立索引。例如,如果要在固定时间内按id获取对象,除了将它们添加到列表中,还可以将它们添加到
    字典中

    现在,您可以在固定时间内按id获取对象:

    Custom custom = all[someGuid];
    
    其他类属性可以遵循这种方法

    为什么我要谈论
    IEqualityComparer
    IEquatable
    ?因为如果整个属性中有一个是另一个自定义类,那么可能需要实现一个所谓的接口(和/或重写
    Object.Equals
    Object.GetHashCode
    )来实现自定义等式,因此字典键将是唯一的

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

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

    …您可以为
    Args
    实现一个
    IEqualityComparer
    ,以提供一个组合哈希代码,并能够使用
    Args
    作为字典键。这就像在给定的
    Args
    实例中查找与所有提供属性匹配的对象一样。。。(例如,在where子句中使用
    &&
    运算符…。

    您的问题不是很清楚,是否要查找所有?这是违反直觉的…你已经有了完整的列表。还有,排序后的集合是什么类型的