有没有一种方法可以循环 if 语句以对象列表中的特定变量为目标 C#

Is there a way to loop if statements targetting a specific variable from a list of objects C#

在我的class(书籍)中有一个变量(Bcopies)表示这些对象中有多少是“借来的” 从我的列表(值)中,我已经得到了最高的整数,它被显示为“最受欢迎的项目” 我想要一种更好的方式来显示它,而不是针对所讨论变量的每个实例使用多个 if 语句(Bcopies)我想到了一个 for-each 循环,但不知道如何使用列表中的变量实现

这是我的程序

namespace Library
{
    class Program
    {
        static void Main(string[] args)
        {
            Book book1 = new Book("book one", "Author one", 900, 35, 16);
            Book book2 = new Book("book two", "Author two", 240, 42, 8);
            Book book3 = new Book("book three", "Author three", 700, 23, 8);
         
            List<Book> BLibShelf = new List<Book>();
            BLibShelf.AddRange(new List<Book>() { book1, book2, book3, book4, book5, book6, book7,  book8 });

            var values = new List<int> { book1.BCopies, book2.BCopies, book3.BCopies, book4.BCopies, book5.BCopies, book6.BCopies, book7.BCopies, book8.BCopies };

            var t = values.Max();

//if statements allocating the "most popular"

if (book1.BCopies == t)
           {
               Console.WriteLine(book1);
           }
           if (book2.BCopies == t)
           {
               Console.WriteLine(book2);
           }
           if (book3.BCopies == t)
           {
               Console.WriteLine(book3);
           }

这是我的class

class Book
    {
        public string title;
        public string author;
        public int pages;
        public int Libcopies;
        public int BCopies;
                     
        public Book(string nTitle, string nAuthor, int nPages, int nLcopies, int nBcopies)
        {
            title = nTitle;
            author = nAuthor;
            pages = nPages;
            Libcopies = nLcopies;
            BCopies = nBcopies;
        }

        public override string ToString()
        {
            return "Book Title:" + title + " |Author:" + author + " |Pages:" + pages + " |Library Copies:" + Libcopies + " |Borrowed Copies:" + BCopies;
        }
        public int TotalCopy()
        {
            
            return BCopies + BCopies;
        }

    }

使用 LINQ:

List<Book> BLibShelf = new List<Book>
{
    new Book("book one", "Author one", 900, 35, 16),
    new Book("book two", "Author two", 240, 42, 8),
    new Book("book three", "Author three", 700, 23, 8)
};

Book mostPopularBook = BLibShelf.OrderByDescending(b => b.BCopies).First();
Console.WriteLine(mostPopularBook);

Language Integrated Query (LINQ) (C#)

如果您使用的是 .NET 6,则可以使用新的 MaxBy Linq 方法:

var mostPopularBook = BLibShelf.MaxBy(b => b.BCopies);

您正在寻找 ArgMax - 我们有 Max 价值 (BCopies) 的参数(在您的案例中是书)。 您可以借助 Linq 通过 MaxBy(需要 .Net 6+)或 Aggregate(较低的 .Net 版本):

  using System.Linq;

  ...

  Book mostPopular = BLibShelf
    .Aggregate((most, book) => most.BCopies > book.BCopies ? most : book);

  Console.Write($"The most popular book is {mostPopular}");