遍历 ObservableCollection 以查找对象和 return 用户输入的可能结果列表
Iterating through ObservableCollection in order to find objects and return list of possible results by user input
我正在创建一个图书馆应用程序,或者说它有书柜,书柜本身有书架和书籍的集合。我现在正在处理 Books,我需要一种方法来根据用户输入遍历列表并根据输入查找可能对象的列表。例如,如果用户指定按流派搜索,并且他输入了 Fantasy,则必须显示流派为 "Fantasy" 的所有对象。
到目前为止,我得到了这个:(一种方法 returns 已经找到一本书对象,但我需要一个包含所有这些的书的列表)。
public Book SearchSpecificBook(string selectedSearch, string input)
{
switch (selectedSearch)
{
case "Title":
foreach (var searchBook in BookContainer)
{
if (input == searchBook.Title )
{
return searchBook;
}
}
break;
case "Author":
foreach (var searchBook in BookContainer)
{
if (input == searchBook.Author )
{
return searchBook;
}
}
break;
case "Genre":
foreach (var searchBook in BookContainer)
{
if (input == searchBook.Genre )
{
return searchBook;
}
}
break;
case "ISBN":
foreach (var searchBook in BookContainer)
{
if (input == searchBook.ISBN)
{
return searchBook;
}
}
break;
}
return null;
}
如果您还没有,请添加以下 using 语句:
using System.Linq;
像这样更新你的案例陈述:
case "Title":
return BookContainer.Where(x => x.Title == input).ToList();
编辑:
您还需要将方法更新为 return
List<Book>
我应该补充一点,这假设 BookContainer 是一个列表或其他实现 IEnumerable 或 IQueryable 的构造(应该是因为您在 foreach 中使用它)。
这个 可能适用也可能不适用 ,但要制作最通用的搜索功能,您可以将搜索谓词传递给您的函数,然后将其传递给 FirstOrDefault
.例如:
public Book SearchSpecificBook(Func<Book, bool> predicate)
{
return BookContainer.FirstOrDefault(predicate);
}
然后像这样从外部调用它:
Book book = bookcase.SearchSpecificBook(x => x.Title == "50 Flavors of Regex");
如果这是不可能的(例如,您希望根据外部条件通过不同的参数进行搜索),您仍然可以通过在 switch 语句中使用 FirstOrDefault
来提高代码的可读性:
switch (selectedSearch)
{
case "Title":
return BookContainer.FirstOrDefault(x => x.Title == input).ToList();
// ...
}
我会考虑为您的搜索添加 enum
of possible search parameters. This would add strong typing 的另一件事:
public enum BookSearchType
{
Title,
Author,
Genre,
ISBN
}
然后您可以像这样切换可能的 BookSearchType
值:
public Book SearchSpecificBook(BookSearchType selectedSearch, string input)
{
switch (selectedSearch)
{
case BookSearchType.Title:
return BookContainer.FirstOrDefault(x => x.Title == input).ToList();
case BookSearchType.Author:
return BookContainer.FirstOrDefault(x => x.Author == input).ToList();
// ...
default:
throw new ArgumentOutOfRangeException(nameof(selectedSearch));
}
}
我正在创建一个图书馆应用程序,或者说它有书柜,书柜本身有书架和书籍的集合。我现在正在处理 Books,我需要一种方法来根据用户输入遍历列表并根据输入查找可能对象的列表。例如,如果用户指定按流派搜索,并且他输入了 Fantasy,则必须显示流派为 "Fantasy" 的所有对象。 到目前为止,我得到了这个:(一种方法 returns 已经找到一本书对象,但我需要一个包含所有这些的书的列表)。
public Book SearchSpecificBook(string selectedSearch, string input)
{
switch (selectedSearch)
{
case "Title":
foreach (var searchBook in BookContainer)
{
if (input == searchBook.Title )
{
return searchBook;
}
}
break;
case "Author":
foreach (var searchBook in BookContainer)
{
if (input == searchBook.Author )
{
return searchBook;
}
}
break;
case "Genre":
foreach (var searchBook in BookContainer)
{
if (input == searchBook.Genre )
{
return searchBook;
}
}
break;
case "ISBN":
foreach (var searchBook in BookContainer)
{
if (input == searchBook.ISBN)
{
return searchBook;
}
}
break;
}
return null;
}
如果您还没有,请添加以下 using 语句:
using System.Linq;
像这样更新你的案例陈述:
case "Title":
return BookContainer.Where(x => x.Title == input).ToList();
编辑: 您还需要将方法更新为 return
List<Book>
我应该补充一点,这假设 BookContainer 是一个列表或其他实现 IEnumerable 或 IQueryable 的构造(应该是因为您在 foreach 中使用它)。
这个 可能适用也可能不适用 ,但要制作最通用的搜索功能,您可以将搜索谓词传递给您的函数,然后将其传递给 FirstOrDefault
.例如:
public Book SearchSpecificBook(Func<Book, bool> predicate)
{
return BookContainer.FirstOrDefault(predicate);
}
然后像这样从外部调用它:
Book book = bookcase.SearchSpecificBook(x => x.Title == "50 Flavors of Regex");
如果这是不可能的(例如,您希望根据外部条件通过不同的参数进行搜索),您仍然可以通过在 switch 语句中使用 FirstOrDefault
来提高代码的可读性:
switch (selectedSearch)
{
case "Title":
return BookContainer.FirstOrDefault(x => x.Title == input).ToList();
// ...
}
我会考虑为您的搜索添加 enum
of possible search parameters. This would add strong typing 的另一件事:
public enum BookSearchType
{
Title,
Author,
Genre,
ISBN
}
然后您可以像这样切换可能的 BookSearchType
值:
public Book SearchSpecificBook(BookSearchType selectedSearch, string input)
{
switch (selectedSearch)
{
case BookSearchType.Title:
return BookContainer.FirstOrDefault(x => x.Title == input).ToList();
case BookSearchType.Author:
return BookContainer.FirstOrDefault(x => x.Author == input).ToList();
// ...
default:
throw new ArgumentOutOfRangeException(nameof(selectedSearch));
}
}