2013-05-06 45 views
5

我正在查詢一個xml文件並且每個選擇返回3個屬性(每個符合我的條件的條目都會返回3個屬性細節)。我需要存儲這些值,然後稍後查找第一個屬性,並返回與其相關的另外2個存儲屬性。如何基於多個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") 
         }; 

上面的代碼返回每發現3個屬性。我需要存儲這3個條目,以便將它們關聯在一起,然後在存儲的條目上執行查找。例如,我需要能夠查找存儲的id = 1的值,並返回相應的類別和選擇條目。

我在研究C#的查找方法,但不明白如何使用它。 List似乎可能工作,但我不知道如何將多個數據片段存儲到列表中的一個條目中(可能連接成一個條目,但我不確定是否執行查找)。任何關於如何使用LIST或LOOKUP(或其他未提及的方式)來做到這一點的建議,我們感激不盡。

回答

3

可以使用Where(或其它選項,如FirstOrDefault,等),以此進一步篩選:

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方法實際上提供一個非常不同的目的。它構建了一個實現ILookup<T,U>的數據結構,這是一個查找表,您可以輕鬆地返回與特定鍵相匹配的所有項目。如果你要從你的數據中執行很多查找,那麼這很有用,但如果你只是想「查找」匹配單個值的項目,那麼這種做法很有用。

2

第一步是創建一個類來存儲數據:

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

其次,如果你的查找是總是通過ID,你可以收集存儲在Dictionary<string, Item>,並與索引屬性來查找:

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

如果您查找需要更加通用的然後把它們存儲在List<Item>做查詢使用LINQ和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

那麼,你可能會希望有一個真正的類型選擇爲:

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

然後,你可以做一些事情像

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 
} 

,或者如果有多個匹配

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