最佳实现" Sql Table索引"在.net列表中

时间:2014-07-28 11:21:55

标签: .net list sorting search indexing

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

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

到目前为止我想到的是:

  1. 我知道如果我可以通过某些属性对列表进行排序 使用the实现我自己的“二进制搜索”属性 二进制搜索.net列表。

  2. 我还可以创建一个我希望索引的列的字典,和 值将是与其匹配的项目,或对它们的一些引用。

  3. 然而,这些解决方案只创建了一个“1列”索引实现,我知道我可以使用字典字典而不是一个“2列”,但我认为那里必须有其他东西来制作更多这个问题的通用解决方案。

    有吗?

1 个答案:

答案 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];