【问题标题】:C# how to loop json2csharp generated classes listsC#如何循环json2csharp生成的类列表
【发布时间】:2019-02-13 12:55:05
【问题描述】:

使用http://json2csharp.com/ 后,我得到了这个结构,我正在尝试遍历所有书籍,但是我不知道如何,我想有更好的方法可以像这样手动获取每个书籍列表BookStores[0].Prism.Books

简而言之,我想遍历每个List<Book>

    public class Book
    {
        public string name { get; set; }
        public int pages { get; set; }
        public double rating { get; set; }
        public bool available { get; set; }
    }

    public class Prism
    {
        public List<Book> Books { get; set; }
    }

    public class Paragraphia
    {
        public List<Book> Books { get; set; }
    }


    public class BookStore
    {
        public Prism Prism { get; set; }
        public Paragraphia Paragraphia { get; set; }
    }

    public class RootObject
    {
        public List<BookStore> BookStores { get; set; }
    }

【问题讨论】:

  • 理想情况下,您的问题应该是如何在 C# 中使用带有列表的循环?-stackoverflow.com/questions/18863187/…
  • 不,看类 BookStore 有成员 Prism 和 Paragraphia 并且这些成员有他们的成员是列表。如何循环它们而不用点直接访问它们

标签: c# json loops arraylist


【解决方案1】:

下面的实现呢。

public class Book
{
    public string name { get; set; }
    public int pages { get; set; }
    public double rating { get; set; }
    public bool available { get; set; }
}

public enum BookCategory
{
    Prism,
    Paragraphia
}

public class BookStore
{
    public Dictionary<BookCategory, List<Book>> Books { get; set; }
}

然后按如下方式使用:

var bookStore = new BookStore();
bookStore.Books = new Dictionary<BookCategory, List<Book>>();

var paragrapiaBooks = new List<Book>();
paragrapiaBooks.Add(new Book{name = "Paragrapia book 1"});
paragrapiaBooks.Add(new Book{name = "Paragrapia book 2"});
bookStore.Books[BookCategory.Paragraphia] = paragrapiaBooks;

var prismBooks = new List<Book>();
prismBooks.Add(new Book{name = "Prism book 1"});
prismBooks.Add(new Book{name = "Prism book 2"});
bookStore.Books[BookCategory.Prism] = prismBooks;

foreach (var bookCategory in bookStore.Books)
{
    foreach (var book in bookCategory.Value)
    {
        Console.WriteLine(book.name);
    }
}
Console.ReadLine();

这样您的实现也更加灵活,当您需要新的图书类别时无需添加新属性,只需添加新的Enum 值即可。例如,除了Enum,您还可以使用String

================================================ ========================

但我认为以下解决方案更好,通过将属性 category 添加到 Book 类,因为它实际上是图书的属性,而不是图书集合的属性。即使将科幻小说放在装满食谱的书架上,它仍然是科幻小说。

public class Book
{
    public string name { get; set; }
    public int pages { get; set; }
    public string category { get; set; }
    public double rating { get; set; }
    public bool available { get; set; }
}

public class BookStore
{
    public List<Book> Books { get; set; }
}

然后按如下方式使用:

var bookStore = new BookStore();
bookStore.Books = new List<Book>();
bookStore.Books.Add(new Book { name = "Paragrapia book 1", category = "Paragrapia" });
bookStore.Books.Add(new Book { name = "Paragrapia book 2", category = "Paragrapia" });
bookStore.Books.Add(new Book { name = "Prism book 1", category = "Prism" });
bookStore.Books.Add(new Book { name = "Prism book 2", category = "Prism" });

Console.WriteLine("ONLY PRISM BOOKS:");
foreach (var book in bookStore.Books.Where(b => b.category == "Prism"))
{
    Console.WriteLine(book.name);
}

Console.WriteLine("\r\nALL BOOKS:");
foreach (var book in bookStore.Books)
{
    Console.WriteLine(book.name);
}
Console.ReadLine();

【讨论】:

  • 不,你不明白我的意思。我如何循环访问成员 Prism 和 Paragraphia 列表,而不像您展示的那样直接访问它们。我有超过 2 个,你建议每个人我应该 bookstore.Prism bookstore.Litreture bookstore.AnotherOne
  • 好吧,这确实是另一个问题。我会更新答案。
  • @padolebala:这对你有帮助吗?
猜你喜欢
  • 2020-08-07
  • 1970-01-01
  • 2022-01-13
  • 2020-05-19
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多