Tôi không nghĩ rằng có một mảng như là chìa khóa là một ý tưởng hay, đặc biệt nếu nó lớn và nếu logic bình đẳng của bạn dựa trên nội dung của mảng. Bởi vì mỗi khi bạn sẽ gọi GetHashCode
, nó sẽ phải thực hiện các phép tính trên toàn bộ mảng, có thể mất chút thời gian nếu mảng lớn ...
Một giải pháp sẽ là bọc mảng trong một lớp sẽ lưu trữ hashcode cho đến khi dữ liệu được sửa đổi, do đó nó không được tính toán lại mỗi khi:
class ArrayWrapper<T>
{
private T[] _array;
public ArrayWrapper(T[] array)
{
_array = array;
}
private int? _hashcode;
public override int GetHashCode()
{
if (!_hashcode.HasValue)
{
_hashcode = ComputeHashCode();
}
return _hashcode.Value;
}
public override bool Equals(object other)
{
// Your equality logic here
}
protected virtual int ComputeHashCode()
{
// Your hashcode logic here
}
public int Length
{
get { return _array.Length; }
}
public T this[int index]
{
get { return _array[index]; }
set
{
_array[index] = value;
// Invalidate the hashcode when data is modified
_hashcode = null;
}
}
}
vì vậy, từ điển của bạn sẽ là một Dictionary<ArrayWrapper<double>, ArrayWrapper<double>>
. Tất nhiên, bạn có thể muốn thêm một số phương thức hoặc thuộc tính cho trình bao bọc (ví dụ: IList<T>
)
Nguồn
2010-05-25 21:14:07
Nếu bạn có thể thỏa mãn sự tò mò của mình, doanh nghiệp cần chìa khóa là mảng gì? –
Tôi đang thu thập cặp đầu vào-đầu ra (kích thước lớn) trong một vấn đề phân loại, trong đó các cặp lặp lại được tính trung bình bằng cách nào đó trước phân loại đào tạo ... – Betamoo