“最佳实施”;Sql表索引“;在.net列表中
在SQL中,您可以对表应用索引,因为表在后台按这些列进行排序,这使得插入和更新更慢,但按该列进行选择要快得多 有没有实现的方法,或者在.net列表上实现这种格式的最佳方法是什么(当然,列是对象的属性) 到目前为止,我想到的是:“最佳实施”;Sql表索引“;在.net列表中,.net,list,sorting,search,indexing,.net,List,Sorting,Search,Indexing,在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];