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