2013-05-06 10 views
5

Sto interrogando un file xml e restituendo 3 attributi per selezione (ogni voce che soddisfa i miei criteri restituirà 3 dettagli degli attributi). Ho bisogno di memorizzare questi valori, quindi in seguito cercare il primo attributo e restituire gli altri 2 attributi memorizzati ad esso correlati.Come memorizzare e cercare dati, in base a più attributi 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") 
         }; 

Il codice di cui sopra restituisce 3 attributi per voce trovato. Ho bisogno di memorizzare quelle 3 voci in modo che siano associate insieme, quindi eseguire una ricerca sulle voci memorizzate. Quindi, ad esempio, devo essere in grado di cercare un valore memorizzato di id = 1 e restituire la categoria corrispondente e la voce di selezione.

Stavo cercando il metodo di ricerca di C# ma non capisco come usarlo. Le liste sembrano funzionare, ma non so come memorizzare più dati in una voce in una lista (magari concatenati in una singola voce, ma non sono sicuro di eseguire la ricerca su di essa). Qualche suggerimento su come farlo con LIST o LOOKUP (o altri modi non menzionati) sono apprezzati.

risposta

3

È possibile utilizzare Where (o altre opzioni, come ad esempio FirstOrDefault, ecc) per filtrare questo ulteriore:

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

Il metodo ToLookup serve in realtà uno scopo molto diverso. Costruisce una struttura dati che implementa ILookup<T,U>, che è una tabella di ricerca in cui è possibile restituire facilmente tutti gli elementi che corrispondono a una chiave specifica. Questo è utile se hai intenzione di eseguire molte ricerche dai tuoi dati, ma non se vuoi semplicemente "cercare" elementi corrispondenti a un singolo valore.

2

Il primo passo è quello di creare una classe per memorizzare i dati:

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

In secondo luogo, se i vostri ricerche sono sempre da ID, è possibile memorizzare la collezione in un Dictionary<string, Item> e per le ricerche con la proprietà indicizzatore :

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

Se le ricerche devono essere più generico quindi solo conservarle in un List<Item> e fare ricerche con funzioni di LINQ e lambda:

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

Beh, si sarebbe probabilmente vuole un tipo reale per selezionare in:

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

Poi si possono fare alcune cose come

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 
} 

o se ci sono più corrispondenze

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