2010-04-19 42 views
13

Cấu trúc dữ liệu C# nào tốt nhất để sử dụng một khóa và có hai giá trị được rút ra?Từ điển C#, 2 Giá trị

Về cơ bản tôi cần một Dictionary<string, string, string>. Có cái gì như thế này?

Trả lời

21

Nếu bạn đang sử dụng .NET 4, bạn có thể sử dụng

Dictionary<string, Tuple<string, string>> 

Nếu bạn không, bạn có thể tạo riêng Tuple loại của bạn mà hoạt động theo cách tương tự :)

Ngoài ra, nếu bạn chỉ cần điều này ở một nơi bạn có thể tạo loại của riêng bạn mà đóng gói hai chuỗi gọn gàng bằng cách sử dụng tên thích hợp. Ví dụ:

public sealed class NameAndAddress 
{ 
    private readonly string name; 
    public string Name { get { return name; } } 

    private readonly string address; 
    public string Address { get { return address; } } 

    public NameAndAddress(string name, string address) 
    { 
     this.name = name; 
     this.address = address; 
    } 
} 

Sau đó, bạn có thể sử dụng:

Dictionary<string, NameAndAddress> 

mà làm cho nó rất rõ ràng những gì đang xảy đến được lưu trữ.

Bạn có thể thực hiện bình đẳng, v.v. nếu bạn muốn. Cá nhân tôi muốn thấy các loại điều này dễ dàng hơn - loại vô danh gần làm điều đó, nhưng sau đó bạn không thể đặt tên cho chúng ...

+2

Ooh tuple ....! –

+0

Kín, chỉ đọc, tài sản, ... - đừng nhầm lẫn anh ta;) – Danvil

+1

Kín, chỉ đọc, thuộc tính, ... - một trong những ví dụ ngắn gọn nhất mà tôi từng thấy. Nhưng những gì về trọng Equals và GetHashCode? :) –

6
class A { 
    public string X, Y; 
} 

Dictionary<string, A> data; 
3

Tạo một cấu trúc chứa các giá trị của bạn và sau đó sử dụng

Dictionary<string, MyStruct> dict = new Dictionary<string, MyStruct>(); 
0

Bạn có thể sử dụng một cuốn từ điển của KeyValuePairs

Dictionary<string,KeyValuePair<string,string>> 
+3

Tôi không thích ý tưởng này, mặc dù nó * sẽ * làm những gì bạn muốn, nó gây hiểu nhầm - tại sao chuỗi thứ hai được xem là chìa khóa cho thứ ba? –

+0

Có, bạn nói đúng, nhưng trong một số trường hợp là giải pháp nhanh và không quá xấu ... Dù sao việc triển khai tùy chỉnh hoặc việc sử dụng Tuple có lẽ là tốt nhất nói chung (nhưng Tuple chỉ có trong .net 4.0) – digEmAll

+0

-1 Điều này rất gây hiểu nhầm. Không có logic trong những gì nên là một chìa khóa và những gì phải là một giá trị trong KeyValuePair

0

Vâng, có exactly that. Bạn có thể lưu trữ hai giá trị của bạn trong một lớp hoặc một cấu trúc. Hay bạn muốn cái gì khác?

0

Tạo một lớp học để giữ giá trị của bạn và biến nó thành một từ điển. Nếu lớp chỉ được sử dụng trong ngữ cảnh của một lớp chứa (ví dụ: nó được sử dụng để phân phối cấu trúc dữ liệu cho thuộc tính lớp), bạn có thể đặt lớp của bạn là lớp lồng nhau riêng tư.

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