2013-05-06 22 views
5

Bir xml dosyası sorguladım ve seçim başına 3 özniteliği döndürüyorum (kriterlerimi karşılayan her girdi 3 öznitelik ayrıntılarını döndürecektir). Bu değerleri saklamak ve daha sonra ilk özniteliği aramak ve bununla ilişkili 2 diğer saklı öznitelikleri döndürmek gerekir.Birden çok xml özniteliğine dayanan veri nasıl saklanır ve aranır?

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") 
         }; 

Yukarıdaki kod bulundu öğe başına 3 özelliklerini döndürür. Bu 3 girdiyi birlikte ilişkilendirilmeleri için kaydetmem gerekiyor, daha sonra depolanan girişler üzerinde bir arama gerçekleştirmeliyim. Öyleyse, saklı bir id = 1 değerine bakabilmem ve karşılık gelen kategori ve seçim girişini geri verebilmem gerekir.

C# Arama yöntemini araştırıyordum ama nasıl kullanıldığını anlamıyorum. Liste işe yarayacak gibi görünüyor, ancak bir verideki bir girdiye birden fazla veri parçasını nasıl depolayacağımı bilmiyorum (belki de tek bir girdiyle birleştirmek istiyorum, ancak sonra da bu dosyayı arama konusunda emin değilim). Bunu LIST veya LOOKUP (veya başka bir şekilde kabul edilmeyen yol) ile nasıl yapılacağına dair herhangi bir öneriniz var.

cevap

3

Sen Daha fazla filtrelemek Where (veya diğer seçenekleri FirstOrDefault gibi, vs) kullanabilirsiniz:

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); 
} 

ToLookup yöntem aslında çok farklı bir amaca hizmet eder. Bu, belirli bir anahtarla eşleşen öğelerin tümünü kolayca döndürebileceğiniz bir arama tablosu olan ILookup<T,U>'u uygulayan bir veri yapısı oluşturur. Bu, verilerinizden çok sayıda arama gerçekleştirecek, ancak yalnızca tek bir değere uyan öğeleri "ara" yapmak istiyorsanız kullanışsızdır. Bir Dictionary<string, Item> koleksiyonu depolayabilir ve dizin özelliğiyle aramalarını için, sizin aramaları ID tarafından daimaise,

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

İkinci:

2

ilk adım veri depolamak için bir sınıf yaratmaktır :

// 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]; 

sizin aramaları daha genel olması gerekir o zaman sadece List<Item> saklayın ve Linq ve lambda fonksiyonları ile aramalarını yaparsanız

:

Eh
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

, gerçek tip içine seçmek istediğiniz muhtemelen olacaktır:

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

Sonra

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 
} 

gibi bazı şeyler yapabilirsiniz veya birden çok eşleşme

varsa
IEnumberable<Item> itemsICareAbout = 
     items.Where(item => item.id == "someIdNumber'); 
foreach(Item item in itemsICareAbout) 
{ 
    // do stuff for each item 
} 
İlgili konular