“最佳实施”;Sql表索引“;在.net列表中

“最佳实施”;Sql表索引“;在.net列表中,.net,list,sorting,search,indexing,.net,List,Sorting,Search,Indexing,在SQL中,您可以对表应用索引,因为表在后台按这些列进行排序,这使得插入和更新更慢,但按该列进行选择要快得多 有没有实现的方法,或者在.net列表上实现这种格式的最佳方法是什么(当然,列是对象的属性) 到目前为止,我想到的是: 我知道如果我能按属性对列表进行排序,我可以 使用 net列表的二进制搜索 我还可以为我希望索引的列创建一个字典,然后 这些值将是与之匹配的项,或者是对它们的引用 然而,这些解决方案只创建了一个“1列”索引实现,我知道我可以使用一个字典字典,而不是一个“2列”字典,但我认为

在SQL中,您可以对表应用索引,因为表在后台按这些列进行排序,这使得插入和更新更慢,但按该列进行选择要快得多

有没有实现的方法,或者在.net列表上实现这种格式的最佳方法是什么(当然,列是对象的属性)

到目前为止,我想到的是:

  • 我知道如果我能按属性对列表进行排序,我可以 使用 net列表的二进制搜索

  • 我还可以为我希望索引的列创建一个字典,然后 这些值将是与之匹配的项,或者是对它们的引用

  • 然而,这些解决方案只创建了一个“1列”索引实现,我知道我可以使用一个字典字典,而不是一个“2列”字典,但我认为必须有其他东西才能为这个问题提供更通用的解决方案


    有吗?

    如果比较两个相同类型对象的方法同时考虑了这两个属性,或者基于两个属性实现了hashcode,那么应该没有问题(相同表示三个或更多属性)。不需要创建字典的字典

    例如:

    公共类PersonKey{
    私有类MyComparer:比较器{
    公共覆盖整数比较(PersonKey x,PersonKey y){
    int result=x.Name.CompareTo(y.Name);
    如果(结果==0){
    返回x.Age.CompareTo(y.Age);
    }
    返回结果;
    }
    }
    public static readonly Comparer Comparer=new MyComparer();
    公共字符串名称{get;set;}
    公共整数{get;set;}
    公共覆盖int GetHashCode(){
    返回名称。GetHashCode()^Age;
    }
    公共覆盖布尔等于(对象对象对象){
    var person=(PersonKey)obj;
    返回Age==person.Age&&string.Compare(Name,person.Name,StringComparison.Ordinal)==0;
    }
    }
    公共类人员:PersonKey{
    公共字符串LastName{get;set;}
    }
    
    现在如何使用它们:

    var unsortedPersons = new List<Person> {
      new Person { Age = 26, Name = "Dan", LastName ="Brown" },
      new Person { Age = 18, Name = "Amanda", LastName = "Lear" },
      new Person { Age = 19, Name = "Amanda", LastName = "Brown" },
      new Person { Age = 15, Name = "Cicero", LastName = "Pubius" }
    };
    
    var hashset = unsortedPersons.ToDictionary<Person, PersonKey>(p => p);
    // O(1) you can't have two items with same key there though
    var dan = hashset[new PersonKey { Age = 26, Name = "Dan" }];
    
    // array is now usable for binary search
    var sortedPersons = unsortedPersons.OrderBy(p => p, PersonKey.Comparer).ToArray();
    // O(log(N))
    int index = Array.BinarySearch<Person>(sortedPersons, new Person { Name = "Amanda", Age = 18 }, PersonKey.Comparer);
    var amanda = sortedPersons[index];    
    
    var unsortedPersons=新列表{
    新人{Age=26,Name=“Dan”,LastName=“Brown”},
    新人{Age=18,Name=“Amanda”,LastName=“Lear”},
    新人{Age=19,Name=“Amanda”,LastName=“Brown”},
    新人{Age=15,Name=“Cicero”,LastName=“Pubius”}
    };
    var hashset=unsortedPersons.ToDictionary(p=>p);
    //O(1)但不能有两个具有相同密钥的项
    var dan=hashset[newpersonkey{Age=26,Name=“dan”}];
    //数组现在可用于二进制搜索
    var sortedPersons=unsortedPersons.OrderBy(p=>p,PersonKey.Comparer.ToArray();
    //O(对数(N))
    int index=Array.BinarySearch(sortedPersons,newperson{Name=“Amanda”,Age=18},PersonKey.Comparer);
    var amanda=分类人员[索引];
    
    您好,谢谢您的回答,我不确定自己是否完全理解->使用您创建的Person类,我如何编写代码从给定的人员列表中选择一个年龄为X、姓名为Y的人员(这比循环所有项目要快…)@MatanL-我已经用实际的“pick item”示例更新了答案。嗯。
    var unsortedPersons = new List<Person> {
      new Person { Age = 26, Name = "Dan", LastName ="Brown" },
      new Person { Age = 18, Name = "Amanda", LastName = "Lear" },
      new Person { Age = 19, Name = "Amanda", LastName = "Brown" },
      new Person { Age = 15, Name = "Cicero", LastName = "Pubius" }
    };
    
    var hashset = unsortedPersons.ToDictionary<Person, PersonKey>(p => p);
    // O(1) you can't have two items with same key there though
    var dan = hashset[new PersonKey { Age = 26, Name = "Dan" }];
    
    // array is now usable for binary search
    var sortedPersons = unsortedPersons.OrderBy(p => p, PersonKey.Comparer).ToArray();
    // O(log(N))
    int index = Array.BinarySearch<Person>(sortedPersons, new Person { Name = "Amanda", Age = 18 }, PersonKey.Comparer);
    var amanda = sortedPersons[index];