2013-05-06 2 views
5

Я запрашиваю файл xml и возвращаю 3 атрибута на выбор (каждая запись, соответствующая моим критериям, вернет 3 атрибута). Мне нужно сохранить эти значения, а затем найти первый атрибут и вернуть два других хранимых атрибута, связанных с ним.Как хранить и искать данные на основе нескольких атрибутов 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#, но не понимаю, как его использовать. Список выглядит так, как будто они могут работать, но я не знаю, как хранить несколько фрагментов данных в записи в списке (возможно, конкатенация в одну запись, но тогда я не уверен в выполнении поиска на ней). Любые предложения относительно того, как сделать это с помощью СПИСОК или 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> и делать Lookups с функциями Linq и лямбда:

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 
} 
Смежные вопросы