我正在查询xml文件并为每个选择返回3个属性(符合我的条件的每个条目将返回3个属性详细信息)。我需要存储这些值,然后查找第一个属性,并返回与其相关的其他2个存储属性。
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方法,但不了解如何使用它。列表似乎可能有效,但我不知道如何将多个数据存储到列表中的条目中(可能连接成一个条目,但后来我不确定是否对它执行查找)。有关如何使用LIST或LOOKUP(或其他未提及的方式)执行此操作的任何建议均表示赞赏。
答案 0 :(得分: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>
的数据结构,这是一个查找表,您可以在其中轻松返回与特定键匹配的所有项。如果您要从数据中执行许多查找,这很有用,但如果您只想“查找”与单个值匹配的项目,则无效。
答案 1 :(得分: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);
答案 2 :(得分: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
}