5

我正在查询一个 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 (或其他未提及的方式)的建议都值得赞赏。

4

3 回答 3

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>,这是一个查找表,您可以在其中轻松返回与特定键匹配的所有项目。如果您要从数据中执行多次查找,这很有用,但如果您只想“查找”与单个值匹配的项目,则不适用。

于 2013-05-06T15:57:40.397 回答
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;}
}

其次,如果您的查找总是by ID,您可以将集合存储在 a 中Dictionary<string, Item>并使用 indexer 属性进行查找:

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

如果您的查找需要更通用,那么只需将它们存储在 a 中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);
于 2013-05-06T15:58:03.467 回答
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
}
于 2013-05-06T16:06:08.870 回答