2013-05-06 22 views
5

Tôi đang truy vấn tệp xml và trả lại 3 thuộc tính cho mỗi lựa chọn (mỗi mục đáp ứng tiêu chí của tôi sẽ trả về 3 chi tiết thuộc tính). Tôi cần phải lưu trữ các giá trị này, và sau đó tìm kiếm thuộc tính đầu tiên và trả về 2 thuộc tính được lưu trữ khác có liên quan đến nó.Làm cách nào để lưu trữ và tra cứu dữ liệu, dựa trên nhiều thuộc tính xml?

var items = from item in doc.Descendants("SUM") 
         select new 
         {          
          id = (string)item.Attribute("id"), 
          category = (string)item.Attribute("cat"), 
          selection = (string)item.Attribute("sel") 
         }; 

Mã trên trả về 3 thuộc tính cho mỗi mục được tìm thấy. Tôi cần lưu trữ 3 mục đó để chúng được liên kết với nhau, sau đó thực hiện tra cứu các mục được lưu trữ. Vì vậy, ví dụ, tôi cần để có thể tìm kiếm một giá trị được lưu trữ của id = 1, và trả về danh mục tương ứng và mục nhập lựa chọn.

Tôi đã nghiên cứu phương pháp Lookup của C# nhưng không hiểu cách sử dụng nó. Danh sách có vẻ như họ có thể làm việc, nhưng tôi không biết làm thế nào để lưu trữ nhiều mẩu dữ liệu vào một mục trong danh sách (có thể nối vào một mục duy nhất, nhưng sau đó tôi không chắc chắn về việc thực hiện tra cứu trên nó). Bất kỳ đề xuất nào về cách thực hiện điều này bằng DANH SÁCH hoặc LOOKUP (hoặc cách khác không được đề cập) đều được đánh giá cao.

Trả lời

3

Bạn có thể sử dụng Where (hoặc các tùy chọn, chẳng hạn như FirstOrDefault, vv) để lọc này hơn nữa:

var items = from item in doc.Descendants("SUM") 
        select new 
        {          
         Id = (string)item.Attribute("id"), 
         Category = (string)item.Attribute("cat"), 
         Selection = (string)item.Attribute("sel") 
        }; 

var filtered = items.Where(i => i.Id == 1); 

// Then use these as needed 
foreach(var item in filtered) 
{ 
    Console.WriteLine("Cat: {0}, Sel: {1}", item.Category, item.Selection); 
} 

Phương pháp ToLookup thực sự phục vụ một mục đích rất khác nhau. Nó xây dựng một cấu trúc dữ liệu thực hiện ILookup<T,U>, đây là một bảng tra cứu, nơi bạn có thể dễ dàng trả về tất cả các mục phù hợp với một khóa cụ thể. Điều này rất hữu ích nếu bạn định thực hiện nhiều tra cứu từ dữ liệu của bạn, nhưng không phải nếu bạn chỉ muốn "tra cứu" các mục phù hợp với một giá trị duy nhất.

2

Bước đầu tiên là tạo ra một lớp học để lưu trữ dữ liệu:

public class Item // come up with a better name... 
{ 
    public string ID {get; set;} 
    public string Catagory {get; set;} 
    public string Selection {get; set;} 
} 

Thứ hai, nếu tra cứu của bạn là luôn bởi ID, bạn có thể lưu trữ các bộ sưu tập trong một Dictionary<string, Item> và tra cứu với tài sản indexer :

// add 
var dict = (from item in doc.Descendants("SUM") 
      select new Item 
      {          
       ID = (string)item.Attribute("id"), 
       Category = (string)item.Attribute("cat"), 
       Selection = (string)item.Attribute("sel") 
      }) 
      .ToDictionary(i=>i.ID, i=>i); 
// lookup 
Item foundItem = dict[lookupID]; 

Nếu tra cứu của bạn cần phải được chung chung hơn sau đó chỉ cần lưu trữ chúng trong một List<Item> và làm tra cứu với LINQ và lambda chức năng:

List<Item> myList = new List<Item>(); 

// add items 
List.Add(item); 

// lookup one 
Item item = myList.Single(i => i.ID == lookupID); 
// lookup many 
var items = myList.Where(i => i.Category == lookupCategory); 
0

Vâng, bạn có thể sẽ muốn có một loại thực để chọn thành:

public class Item 
{          
    public string id { get; set; } 
    public string category { get; set; } 
    public string selection { get; set; } 
}; 

Sau đó, bạn có thể làm một số việc như

IEnumberable<Item> items = from item in doc.Descendants("SUM") 
        select new 
        {          
         id = (string)item.Attribute("id"), 
         category = (string)item.Attribute("cat"), 
         selection = (string)item.Attribute("sel") 
        }; 

Item itemIWant = items.Where(item => item.id == "someIdNumber") 
         .FirstOrDefault(); 
if (itemIWant != null) 
{ 
    // do stuff with itemIWant.category and itemIWant.selection 
} 

hoặc nếu có nhiều trận đấu

IEnumberable<Item> itemsICareAbout = 
     items.Where(item => item.id == "someIdNumber'); 
foreach(Item item in itemsICareAbout) 
{ 
    // do stuff for each item 
} 
Các vấn đề liên quan