任何人都可以告訴我如何ObjectIDGenerator更好(更糟?),然後使用HashSet遍歷對象的層次結構(這可能是recurvise/circular),而不是想要遍歷同一個對象兩次?ObjectIDGenerator與HashSet <T>
1
A
回答
4
基本的區別在於每個人如何平等。
ObjectIdGenerator查看參照標識。當檢查一個對象是否已經存在時,它只會對兩個對象實例執行==調用。這將歸結爲參考比較,因爲對象在這一點上是靜態類型的對象。這很好,除非你的對象明確地使用.Equals()來實現相等。如果兩個對象通過.Equals()但是不同的引用相等,ObjectIDGenerator會將它們視爲不同的對象。可能不是你想要的。
另一方面,HashSet允許您自定義通過IEqualityComparer <T>參數比較對象的方式。如果沒有指定,它將使用EqualityComparer <T>。將使用值相等的默認值。此方法將調用.Equals()並依賴它來確定兩個對象是否相等。在你沒有爲你的類型定義一個.Equals()方法的情況下,它會默認回到引用相等,這幾乎肯定是你想要的。
總之,去與HashSet的:)
示例代碼顯示的區別:
class Person
{
public readonly string Name;
public Person(string name) { Name = name; }
public override int GetHashCode()
{
return Name.GetHashCode();
}
public override bool Equals(object obj)
{
var other = obj as Person;
if (other == null)
{
return false;
}
return StringComparer.Ordinal.Equals(Name, other.Name);
}
}
public static void Example()
{
var gen = new ObjectIDGenerator();
bool isFirst;
var person1 = new Person("John");
var person2 = new Person("Bob");
gen.GetId(person1, out isFirst); // isFirst = true
gen.GetId(person1, out isFirst); // isFirst = true
gen.GetId(person2, out isFirst); // isFirst = false
gen.GetId(new Person("John"), out isFirst); // isFirst = true even though they are .Equals()
var set = new HashSet<Person>();
set.Add(person1);
var contains1 = set.Contains(person1); // true
var contains2 = set.Contains(new Person("John")); // true
}
相關問題
- 1. System.Runtime.Serialization :: ObjectIDGenerator
- 2. ObjectIDGenerator實現
- 3. 填寫一個HashSet <T>與ISomething
- 4. HashSet <String> .contains()
- 5. .NET 4 ISet <> HashSet <>替換NHibernate Iesi.Collections ISet,HashSet?
- 6. HashSet <T>性能(與ObservableCollection <T>相比)?
- 7. HashSet與ArrayList
- 8. 部隊更新TGT
- 9. 'Set = new HashSet'或'HashSet = new Hashset'?
- 10. 構建HashSet時允許重複<T>與列表<T>參數?
- 11. Java,泛型:Set <?> s = HashSet <String>()和Set s = HashSet <String>()之間的區別是什麼?
- 12. 無法從AD獲得TGT
- 13. HashSet <T>去哪裏VS2012?
- 14. F# - >實現HashSet的IComparable <'a>
- 15. 的Java HashSet的<String>對象
- 16. Windows Phone 7上的HashSet <T>
- 17. 是HashSet <T> Xml可串行化?
- 18. HashSet <T> .IntersectWith()返回0結果
- 19. IndexOutOfRangeException添加到Hashset時<T>
- 20. 包含HashSet的<Integer>的Python中
- 21. HashSet的初始容量<Integer>
- 22. 對於.Net,沒有Hashset <T, G>?
- 23. HashSet中的自定義類<>
- 24. ServiceStack JSONSerializer和HashSet的<x>
- 25. 錯誤與Cas SERVICE_TICKET_NOT_CREATED和TGT與JBoss 5.1.0一起銷燬.GA
- 26. 值類型ObjectIDGenerator方法在C#中
- 27. 問題與JSTL的Hashset
- 28. HashSet <T>和List <T>有什麼區別?
- 29. AutoMapper:class屬性,映射ISet <object>到HashSet <Object>
- 30. 如何繪製複雜的IDictionary <ProtectionGroupIdentifier,HashSet的<VMIdentifier >>