2011-11-12 34 views
5

Tôi cần lưu 2 giá trị trong một danh sách để tôi có tất cả các vị trí VÀ điều khiển của bảng của tôi trong một danh sách. Tôi đã sử dụng một từ điển nhưng tôi phát hiện ra rằng chỉ có một cách ánh xạ. Có ai có bất kỳ đề xuất nào ngoại trừ Mảng 2 chiều không?Danh sách Ánh xạ hai chiều

+0

Bạn muốn lưu trữ 2 loại khác nhau trong một Bộ sưu tập? –

+0

Vâng đó chính là điều tôi muốn làm! –

Trả lời

6

Bạn có thể sử dụng một cuốn từ điển dễ dàng đủ như một ánh xạ hai chiều nếu bạn không quan tâm đến hiệu suất tuyến tính tìm kiếm ánh xạ ngược (mà bạn sẽ nhận được với mảng 2D anyway):

var dictionary = new Dictionary<string, int>(); 
// Fill it up... 
int forwardMapResult = dictionary["SomeKey"]; 
string reverseMapResult = dictionary.Where(kvp => kvp.Value == 5).First().Key; 

Nếu tốc độ tra cứu là một vấn đề hơn bạn sẽ phải duy trì hai từ điển - một cho tra cứu chuyển tiếp và một cho ngược lại. Hoặc sử dụng cơ sở dữ liệu có thể lập chỉ mục trong bộ nhớ, chẳng hạn như SQLite.

7

này có thể giúp:

public class BiDirectionalDictionary<L, R> 
{ 
    private readonly Dictionary<L, R> leftToRight = new Dictionary<L, R>(); 
    private readonly Dictionary<R, L> rightToLeft = new Dictionary<R, L>(); 
    public void Add(L leftSide, R rightSide) 
    { 
     if (leftToRight.ContainsKey(leftSide) || 
      rightToLeft.ContainsKey(rightSide)) 
      throw new DuplicateNameException(); 
     leftToRight.Add(leftSide, rightSide); 
     rightToLeft.Add(rightSide, leftSide); 
    } 
    public L this[R rightSideKey] 
    { get { return rightToLeft[rightSideKey]; } } 
    public R this[L leftSideKey] 
    { get { return leftToRight[leftSideKey]; } } 
    public bool ContainsKey(L leftSideKey) 
    { return leftToRight.ContainsKey(leftSideKey); } 
    public bool ContainsKey(R rightSideKey) 
    { return rightToLeft.ContainsKey(rightSideKey); } 
} 
[Serializable] 
public class DuplicateNameException : SystemException 
{ 
    protected DuplicateNameException(
      SerializationInfo info, StreamingContext context); 
    public DuplicateNameException(); 
    public DuplicateNameException(string s); 
    public DuplicateNameException(string message, 
      Exception innerException); 
} 

này có một vấn đề nếu phía bên trái và bên phải là cùng loại ... tức là, nó không hoạt động đúng nếu bạn cố gắng

var myBiDireDict = new BiDirectionalDictionary<DateTime, DateTime>(); 
+0

Giả sử L & R rất tốt không cùng loại và luôn có mối quan hệ 1 đến 1. –

Các vấn đề liên quan