有没有一种方法可以循环 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);
如果您使用的是 .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}");
在我的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);
如果您使用的是 .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}");