繁体   English   中英

访问不同类别的锯齿状 arrays - C#

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM