在SQL中,您可以在表上应用索引,因为表格在这些列的后台排序,这使得插入和更新速度更慢,但是按该列选择要快得多,
有没有办法实现,或者在.net列表上实现这种格式的最佳方式是什么(当然列是对象的属性)
到目前为止我想到的是:
我知道如果我可以通过某些属性对列表进行排序 使用the实现我自己的“二进制搜索”属性 二进制搜索.net列表。
我还可以创建一个我希望索引的列的字典,和 值将是与其匹配的项目,或对它们的一些引用。
然而,这些解决方案只创建了一个“1列”索引实现,我知道我可以使用字典字典而不是一个“2列”,但我认为那里必须有其他东西来制作更多这个问题的通用解决方案。
有吗?
答案 0 :(得分:1)
如果比较两个相同类型对象的方法同时考虑了两个属性,或者您基于两个属性实现了哈希码,那么您应该没问题(相同代表三个或更多属性)。无需创建字典词典。
E.g:
public class PersonKey {
private class MyComparer : Comparer<PersonKey> {
public override int Compare(PersonKey x, PersonKey y) {
int result = x.Name.CompareTo(y.Name);
if (result == 0) {
return x.Age.CompareTo(y.Age);
}
return result;
}
}
public static readonly Comparer<PersonKey> Comparer = new MyComparer();
public string Name { get; set; }
public int Age { get; set; }
public override int GetHashCode() {
return Name.GetHashCode() ^ Age;
}
public override bool Equals(object obj) {
var person = (PersonKey)obj;
return Age == person.Age && string.Compare(Name, person.Name, StringComparison.Ordinal) == 0;
}
}
public class Person : PersonKey {
public string 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];