3

これらの 2 つのクラスとこの linq リクエストがあるとします。

var cats = from c in xml.Descendants("category")
           let categoryName = c.Attribute("name").Value
           let descendants = c.Descendants()
           select new Category
           {
                Name = categoryName,
                Items = from d in descendants
                        let typeId = d.Attribute("id").Value
                        select new Item
                        {
                            Id = typeId,
                            Name = d.Value,
                            Category = ???????
                        }
           };

class Category
{
    string Name;
    IEnumerable<Item> Items;
}

class Item
{
    string Id;
    string Name;
    Category Category;
}

アイテムのカテゴリを現在選択されているカテゴリに変更するにはどうすればよいですか? this多分のようなキーワードの一種?

4

1 に答える 1

1

再帰の時間です!を取得する関数をラップし、Category必要に応じて呼び出すだけです。

public static IQueryable<Category> GetCategories(string catName, XDocument xml)
{
      var cats = from c in xml.Descendants("category")
                 let categoryName = c.Attribute("name").Value
                 let descendants = c.Descendants()
                 where (catName == "" || categoryName == catName)
                 select new Category
                 {
                      Name = categoryName,
                      Items = from d in descendants
                              let typeId = d.Attribute("id").Value
                              select new Item
                              {
                                  Id = typeId,
                                  Name = d.Value,
                                  Category = GetCategories(categoryName, xml).FirstOrDefault()
                              }
                };

       return cats.AsQueryable();
}

そして、あなたはそれをこのように呼びます:

XDocument xml = XDocument.Parse(...); // parse the xml file
IQueryable<Category> cats = GetCategories("", xml);

結果をフィルタリングする必要がないため、関数呼び出しの最初のロードでは、カテゴリ名として空の文字列が使用されます。次に、同じ関数を再帰的に呼び出しますが、カテゴリ名でフィルタリングします。それを試してみて、私のために働いた。

于 2012-08-31T11:16:57.850 に答える