【问题标题】:Best Implementation of "Sql Table index" on a .net list.net 列表上“Sql 表索引”的最佳实现
【发布时间】:2014-09-19 13:50:39
【问题描述】:

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

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

到目前为止我想到了什么:

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

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

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

有吗?

【问题讨论】:

    标签: .net list sorting search indexing


    【解决方案1】:

    如果您比较相同类型的两个对象的方法同时考虑了两个属性,或者您基于两个属性实现哈希码,那么您应该没问题(相同代表三个或更多属性)。无需创建字典。

    例如:

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

    【讨论】:

    • 嗨,感谢您的回答,我不确定我是否完全理解 -> 使用您创建的 Person 类,我将如何编写代码来选择年龄为 X 和姓名为 Y 的人超出给定的人员列表(运行速度比仅循环所有项目...)?
    • @MatanL - 我已经用实际的“选择项目”示例更新了答案。 HTH。
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多