특별한 클래스 인 WrappedDataTable
이 있다고 말하면 각각 WrappedDataTable
을 정확히 하나의 DataTable
과 연결하고 싶습니다. 게다가, 주어진 DataTable
에 대해 하나 이상의 WrappedDataTable
이 존재하기를 원합니다. 나는 익숙해지는 것 때문에, 나는 추측 처음에는 매우 의심 생각 난사전에서 변경 가능한 객체를 키로 사용하는 것이 완전히 괜찮습니까?
public static class DataTableWrapper
{
private Dictionary<DataTable, WrappedDataTable> _wrappedTables;
static DataTableWrapper()
{
_wrappedTables = new Dictionary<DataTable, WrappedDataTable>();
}
public static WrappedDataTable Wrap(this DataTable table)
{
WrappedDataTable wrappedTable;
if (!_wrappedTables.TryGetValue(table, out wrappedTable))
_wrappedTables[table] = wrappedTable = new WrappedDataTable(table);
return wrappedTable;
}
}
:
는 동료가 내 WrappedDataTable
를 캐시와 같이, 하나에 액세스하기 위해 공장 방법을 사용할 수 있습니다 제안 사전에있는 키는 변경 불가능한 유형이어야한다는 생각. 하지만 아마도 이것이 반드시 그런 것은 아닙니다. 빠른 테스트 결과 DataTable
은 내용에 대한 수많은 수정 과정에서 일관된 해시 코드를 유지하는 것으로 나타났습니다. 따라서 Dictionary<DataTable, TValue>
은 ContainsKey
에 대한 올바른 값을 일관되게 반환 할 수있는 것으로 보입니다.
기본적으로 object.GetHashCode
의 기본 버전이 모든 개별 개체에 대해 변함없는 값을 반환하는지 또는 내가 DataTable
으로보고있는 내용이 환상인지 궁금합니다.
전자가 사실이라면
- 그리고object.GetHashCode
잘 작동합니다 - 그것은 "키와 같은 불변적인 유형을 사용하는"것 같다 조언 정말에만 시나리오에 적용
이
- 당신은 할 객체의 평등을 원한다 참조 평등과 반대되는 값 평등 및/또는
- 형식 멤버를 기반으로하는
GetHashCode
구현이있는 사용자 지정 형식이 있습니다.
저에게는 현명한 의사가 있습니까?
UPDATE : 내 질문에 대답하기위한 존 소총에 감사합니다. 다른 뉴스에서 나는 약간의 파기를했고 IEqualityComparer<T>
을 생각해 냈습니다. 은이 결국 신원 비교를 제공합니다!
Imports System.Collections.Generic
Imports System.Runtime.CompilerServices
Public Class IdentityComparer(Of T As Class)
Implements IEqualityComparer(Of T)
Public Overloads Function Equals(ByVal x As T, ByVal y As T) As Boolean _
Implements IEqualityComparer(Of T).Equals
Return Object.ReferenceEquals(x, y)
End Function
Public Overloads Function GetHashCode(ByVal obj As T) As Integer _
Implements IEqualityComparer(Of T).GetHashCode
Return RuntimeHelpers.GetHashCode(obj)
End Function
End Class
이 예제 프로그램을 살펴 보자 :
를 - 그것을 체크 아웃 (번역 사소한 VB.NET 싫어하는 미안 해요, 난 그냥 그래서 제가 그것을 쓴 것은의 VB.NET 프로젝트를했다)Dim comparer As IEqualityComparer(Of String) = New IdentityComparer(Of String)
Dim x As New String("Hello there")
Dim y As New String("Hello there")
Console.WriteLine(comparer.Equals(x, y))
Console.WriteLine(comparer.GetHashCode(x))
Console.WriteLine(comparer.GetHashCode(y))
출력 :
False 37121646 45592480
@ 존 : GetHashCodeBase와 비슷합니까? 나는 결코 자바를 한 적이 없다는 것을 인정한다. (노다 타임은 나의 첫 번째 진출이었고, 기여보다는 코드를 항상 보았다.) –
@Jeff : 기본적으로 어딘가에 정적 메서드가있다. Java에서는'System.identityHashCode'입니다. –
@Jon : 유용합니다. 'ToString'과'Equals'의 원래 구현을 다른 목적으로도 얻을 수 있다면 유용 할 것입니다. –