2011-06-21 41 views
5

Tôi khá mới đối với C# và tôi đến từ nền Ruby. Tôi vẫn còn rất nhiều điều cần tìm hiểu và đó là lý do tại sao tôi hỏi câu hỏi sau:Từ điển C# sử dụng TValue trong một Từ điển khác

Mục tiêu: 1) Tôi muốn tạo một từ điển với chuỗi như khóa và bất kỳ loại đối tượng nào tôi muốn làm giá trị. Một cái gì đó như thế này:

Dictionary<string, T> 

2) Nhưng đó không phải là tất cả. Tôi cũng muốn một từ điển "Thạc sĩ" với chuỗi như các khóa và từ điển được mô tả ở trên làm giá trị. Something như thế này:

Dictionary<string, Dictionary<string T>> 

Tôi muốn nó được như vậy vì vậy tôi có thể làm việc như ví dụ dưới đây:

MasterDictionary[Dict1].Add(Thing1) 
MasterDictionary[Dict2].Add(Thing2) 

Mã hiện tại: Tôi đang cố gắng để đạt được sử dụng này đoạn mã sau

public List<string> DataTypes; 
public Dictionary<string, Dictionary<string, object>> TempData; 
public Dictionary<string, Dictionary<string, object>> GameData; 

public Session() 
     { 
      // Create a list of all Data Types. 
      DataTypes = new List<string>(); 
      DataTypes.Add("DataInfo"); 
      DataTypes.Add("Maps"); 
      DataTypes.Add("Tilesets"); 

      // Create and populate TempData dictionary. 
      TempData = new Dictionary<string, Dictionary<string, object>>(); 
      TempData.Add("DataInfo", new Dictionary<string, DataInfo>()); 
      TempData.Add("Maps", new Dictionary<string, Map>()); 
      TempData.Add("Tilesets", new Dictionary<string, Tileset>()); 

      // Create GameData dictionary and copy TempData into it. 
      GameData = new Dictionary<string, object>(TempData); 
     } 

vấn đề: tôi nhận được các lỗi sau đây

1) Đối sánh phương thức quá tải tốt nhất cho 'System.Collections.Generic.Dictionary> .Thêm (chuỗi, System.Collections.Generic.Dictionary)' có một số đối số không hợp lệ

2) Lỗi 10 Đối số 1: không thể chuyển đổi từ 'System.Collections.Generic.Dictionary>' thành 'System.Collections.Generic.IDictionary'

Những dòng này được gạch dưới màu đỏ

TempData.Add("DataInfo", new Dictionary<string, DataInfo>()); 
TempData.Add("Maps", new Dictionary<string, Map>()); 
TempData.Add("Tilesets", new Dictionary<string, Tileset>()); 

// Create GameData dictionary and copy TempData into it. 
GameData = new Dictionary<string, object>(TempData); 

tôi đã làm rõ điều gì sai hoặc thậm chí bất hợp pháp ở đây, tôi chỉ cần biết nó là gì và tôi có thể sửa nó như thế nào!

Tôi đã tự nghiên cứu rất nhiều nhưng không tìm thấy gì có thể giúp tôi về điều này. Tôi đã thấy làm thế nào để tạo một từ điển từ điển nhưng tôi không hoàn toàn chắc chắn làm thế nào để nói với một từ điển không quan tâm về loại đối tượng trong Giá trị.

Tôi biết "T" có thể là của một số sử dụng ở đây nhưng tôi không thực sự biết làm thế nào để sử dụng nó vì nó luôn luôn nói với tôi "Loại hoặc namespace tên 'T' không thể tìm được"

Vì vậy, tôi nên làm gì?

Cảm ơn trước - Sasha

Trả lời

1

Vấn đề là bạn không phù hợp với typedef của bạn với các đối tượng bạn tạo. Thay đổi mã của bạn thành mã này:

public void Session() 
{ 
    // Create a list of all Data Types. 
    DataTypes = new List<string>(); 
    DataTypes.Add("DataInfo"); 
    DataTypes.Add("Maps"); 
    DataTypes.Add("Tilesets"); 

    // Create and populate TempData dictionary. 
    TempData = new Dictionary<string, Dictionary<string, object>>(); 
    TempData.Add("DataInfo", new Dictionary<string, object>()); 
    TempData.Add("Maps", new Dictionary<string, object>()); 
    TempData.Add("Tilesets", new Dictionary<string, object>()); 

    // Create GameData dictionary and copy TempData into it. 
    GameData = new Dictionary<string, Dictionary<string, object>>(TempData); 
} 
+0

Phương pháp này dường như hoạt động rất tốt! – Sasha

3

bạn có thể thay đổi tất cả các dictonaries chuỗi, đối tượng ....

nhưng có lẽ, kể từ khi bạn đến từ Ruby, có một vấn đề xảy ra ....

đặt tất cả mọi thứ vào từ điển, sau đó phải tìm ra loại chúng là gì khi trích xuất có lẽ không phải là cách tiếp cận tốt nhất. Trong các ngôn ngữ đánh máy, nó thường tốt nhất để làm cho các loại cho tất cả mọi thứ

có lẽ nó sẽ tốt hơn nếu có một đối tượng đánh máy với các bộ từ điển của các loại họ ...

class GameResources 
{ 
    public Dictionary<string, Map> Maps { get; set;} 
    public Dictoinary<string, Tileset> Tileset { get; set; } 
} 

vv ...hoặc khá có thể với một chút suy nghĩ, cấu trúc lớp học khác có thể phù hợp hơn trong trường hợp của bạn

+0

Âm thanh thú vị. Lợi ích của phương pháp AresAvatar là gì? – Sasha

+1

bạn giữ tất cả các loại thông tin cho người mới bắt đầu! Có vẻ như bạn đang tạo từ điển cấu trúc "cố định" để truy cập vào Bản đồ, Gạch, v.v. Đây là những khái niệm lớp học đầu tiên trong trò chơi, vì vậy sẽ tốt để giữ chúng dưới dạng các loại. Điều gì sẽ xảy ra với AresAvatar (đó là sửa chữa đơn giản cho vấn đề trước mắt của bạn) là khi bạn nhận được các đối tượng trở lại, bạn sẽ phải đưa chúng trở lại datatype của họ. Mã của bạn sẽ có kiến ​​thức ngầm về loại nào nằm trong khóa từ điển nào. Tránh điều này, tạo ra các loại, không cần đúc! –

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