[英]Accesse to jagged arrays in different classes - C#
我不得不使用锯齿状的 arrays 来 model 一个系统(一个库)。
每本实体书都必须放在书架上。
书架是一组书架。
目录是一系列书架。
因此,物理书籍的目录“是数组的 arrays 的数组”。
我必须使用三个类来完成所有工作:“PhysicalBook”、“Bookshelf”和“Catalog”。
public class PhysicalBook{
public string ID {get; private set;}
//...
}
public class Bookshelf{
public PhysicalBook[][] bookshelf;
//...
}
public class Catalog{
public Bookshelf[] listBookshelves;
//...
}
我的问题是:如何遍历锯齿状数组“listBookshelves”的每个“PhysicalBook”?
我想在 class“目录”中编写一个名为“SearchPhysicalBook”的方法,给定字符串“ID”,查找关联的书是否存在于“目录”的实例中。
public bool SearchPhysicalBook(string id)
{
for (int i=0; i<this.listBookshelves.Length; i++) {
for (int j = 0; j < this.listBookshelves.Length; j++)
{
for (int k = 0; k < this.listBookshelves.Length; k++) {
/*if (listBookshelves[i][j][k].ID==id)
return true;*/
}
}
}
return false;
}
}
我在最后几行代码中评论的是错误的。
任何人都可以帮助我吗?
您可以使用foreach
代替for
,它更具可读性,如下所示:
public PhysicalBook SearchPhysicalBookById(string id, Catalog catalog)
{
foreach (Bookshelf bookshelf in catalog.listBookshelves)
{
foreach (PhysicalBook[] physicalBooksInShelf in bookshelf.bookshelf)
{
PhysicalBook book = physicalBooksInShelf.FirstOrDefault(book => book.ID.Equals(id));
if (book != null)
{
return book;
}
}
}
return null;
}
我们经常在 Linq 的帮助下查询这样的collections ,在您的情况下,您可以使用SelectMany
来展平锯齿状数组:
using System.Linq;
...
public bool SearchPhysicalBook(string id) => listBookshelves
.SelectMany(shelf => shelf
.bookshelf
.SelectMany(line => line))
.Any(book => book.ID == id);
为了不重复复杂的片段,您可以提取一个方法:
private IEnumerable<PhysicalBook> AllBooks => listBookshelves
.SelectMany(shelf => shelf
.bookshelf
.SelectMany(line => line));
然后你可以SearchPhysicalBook
一样简单
// If book exists
public bool SearchPhysicalBook(string id) =>
AllBooks.Any(book => book.ID == id);
// Book if it exists, null if there's no such a book:
public PhysicalBook BookByID(string id) =>
AllBooks.FirstOrDefault(book => book.ID == id);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.