C# 查找结果后停止进一步查找的搜索函数
我正在开发一个简单的搜索功能。用户输入关键字C# 查找结果后停止进一步查找的搜索函数,c#,refactoring,C#,Refactoring,我正在开发一个简单的搜索功能。用户输入关键字请求。关键字,期望搜索功能“找出”他要查找的内容,然后使用关键字在该集合中搜索。内容的三个选项是名称、编号或代码 我首先想到的是 // Keyword filter if (!string.IsNullOrWhiteSpace(request.Keyword)) { var searchResults = _items.Where(x => x.Name.Contains(request.Keyword)).ToList(); i
请求。关键字
,期望搜索功能“找出”他要查找的内容,然后使用关键字在该集合中搜索。内容的三个选项是名称
、编号
或代码
我首先想到的是
// Keyword filter
if (!string.IsNullOrWhiteSpace(request.Keyword))
{
var searchResults = _items.Where(x => x.Name.Contains(request.Keyword)).ToList();
if (searchResults.Any()) _items = searchResults;
searchResults= _items.Where(x => x.Number == request.Keyword).ToList();
if (searchResults.Any()) _items = searchResults;
searchResults= _items.Where(x => x.Code == request.Keyword).ToList();
if (searchResults.Any()) _items = searchResults;
}
这里的问题是,程序在找到搜索结果后在if
-块中继续搜索,并继续在其他集合中搜索。但既然我们已经有了搜索结果,那就没有必要了
第二个问题是,当没有找到搜索结果时,\u items
保持不变。但事实上,在这种情况下,用户希望它是空的
在代码中,我想要实现的是这样的美:
// Keyword filter
if (!string.IsNullOrWhiteSpace(request.Keyword))
{
var searchResults = _items.Where(x => x.Name.Contains(request.Keyword)).ToList();
if (searchResults.Any())
{
_items = searchResults;
}
else
{
searchResults = _items.Where(x => x.Number == request.Keyword).ToList();
if (searchResults.Any())
{
_items = searchResults;
}
else
{
searchResults = _items.Where(x => x.Code == request.Keyword).ToList();
if (searchResults.Any())
{
_items = searchResults;
}
else
{
// Keyword was set, but no result was found.
_items.Clear();
}
}
}
}
如您所见,嵌套非常可怕(这是简化的代码)。添加新的收藏会让情况变得更糟
如何使用(或多或少)干净的代码实现这一点?方法1。
// Keyword filter
var keyword = request.Keyword;
if (!string.IsNullOrWhiteSpace(keyword))
{
var searchResults = _items.Where(x => x.Name.Contains(keyword)).ToList();
if (searchResults.Length == 0)
searchResults = _items.Where(x => x.Number == keyword).ToList();
if (searchResults.Length == 0)
searchResults = _items.Where(x => x.Code == keyword).ToList();
if (searchResults.Length == 0)
_items.Clear();
else
_items = searchResults;
}
public static List<Item> Search(List<Item> items, Predicate<Item> predicate)
{
var searchResults = items.Where(predicate).ToList();
return searchResults.Any() ? searchResults : null;
}
// Keyword filter
var keyword = request.Keyword;
if (!string.IsNullOrWhiteSpace(keyword))
{
_items =
Search(_items, x => x.Name.Contains(keyword)) ??
Search(_items, x => x.Number == keyword) ??
Search(_items, x => x.Code == keyword) ??
new List<Item>();
}
方式2。
// Keyword filter
var keyword = request.Keyword;
if (!string.IsNullOrWhiteSpace(keyword))
{
var searchResults = _items.Where(x => x.Name.Contains(keyword)).ToList();
if (searchResults.Length == 0)
searchResults = _items.Where(x => x.Number == keyword).ToList();
if (searchResults.Length == 0)
searchResults = _items.Where(x => x.Code == keyword).ToList();
if (searchResults.Length == 0)
_items.Clear();
else
_items = searchResults;
}
public static List<Item> Search(List<Item> items, Predicate<Item> predicate)
{
var searchResults = items.Where(predicate).ToList();
return searchResults.Any() ? searchResults : null;
}
// Keyword filter
var keyword = request.Keyword;
if (!string.IsNullOrWhiteSpace(keyword))
{
_items =
Search(_items, x => x.Name.Contains(keyword)) ??
Search(_items, x => x.Number == keyword) ??
Search(_items, x => x.Code == keyword) ??
new List<Item>();
}
公共静态列表搜索(列表项、谓词)
{
var searchResults=items.Where(谓词).ToList();
返回searchResults.Any()?searchResults:null;
}
//关键词过滤器
var关键字=request.keyword;
如果(!string.IsNullOrWhiteSpace(关键字))
{
_项目=
搜索(_items,x=>x.Name.Contains(关键字))??
搜索(_items,x=>x.Number==关键字)??
搜索(_项,x=>x.Code==关键字)??
新列表();
}
方式1。
// Keyword filter
var keyword = request.Keyword;
if (!string.IsNullOrWhiteSpace(keyword))
{
var searchResults = _items.Where(x => x.Name.Contains(keyword)).ToList();
if (searchResults.Length == 0)
searchResults = _items.Where(x => x.Number == keyword).ToList();
if (searchResults.Length == 0)
searchResults = _items.Where(x => x.Code == keyword).ToList();
if (searchResults.Length == 0)
_items.Clear();
else
_items = searchResults;
}
public static List<Item> Search(List<Item> items, Predicate<Item> predicate)
{
var searchResults = items.Where(predicate).ToList();
return searchResults.Any() ? searchResults : null;
}
// Keyword filter
var keyword = request.Keyword;
if (!string.IsNullOrWhiteSpace(keyword))
{
_items =
Search(_items, x => x.Name.Contains(keyword)) ??
Search(_items, x => x.Number == keyword) ??
Search(_items, x => x.Code == keyword) ??
new List<Item>();
}
方式2。
// Keyword filter
var keyword = request.Keyword;
if (!string.IsNullOrWhiteSpace(keyword))
{
var searchResults = _items.Where(x => x.Name.Contains(keyword)).ToList();
if (searchResults.Length == 0)
searchResults = _items.Where(x => x.Number == keyword).ToList();
if (searchResults.Length == 0)
searchResults = _items.Where(x => x.Code == keyword).ToList();
if (searchResults.Length == 0)
_items.Clear();
else
_items = searchResults;
}
public static List<Item> Search(List<Item> items, Predicate<Item> predicate)
{
var searchResults = items.Where(predicate).ToList();
return searchResults.Any() ? searchResults : null;
}
// Keyword filter
var keyword = request.Keyword;
if (!string.IsNullOrWhiteSpace(keyword))
{
_items =
Search(_items, x => x.Name.Contains(keyword)) ??
Search(_items, x => x.Number == keyword) ??
Search(_items, x => x.Code == keyword) ??
new List<Item>();
}
公共静态列表搜索(列表项、谓词)
{
var searchResults=items.Where(谓词).ToList();
返回searchResults.Any()?searchResults:null;
}
//关键词过滤器
var关键字=request.keyword;
如果(!string.IsNullOrWhiteSpace(关键字))
{
_项目=
搜索(_items,x=>x.Name.Contains(关键字))??
搜索(_items,x=>x.Number==关键字)??
搜索(_项,x=>x.Code==关键字)??
新列表();
}
如果提取此方法以便返回结果而不是继续,则可以跳过所有的其他
s
// Keyword filter
if (string.IsNullOrWhiteSpace(request.Keyword))
{
return emptyList;
}
var searchResults = _items.Where(x => x.Name.Contains(request.Keyword)).ToList();
if (searchResults.Any())
{
return searchResults;
}
searchResults = _items.Where(x => x.Number == request.Keyword).ToList();
if (searchResults.Any())
{
return searchResults;
}
searchResults = _items.Where(x => x.Code == request.Keyword).ToList();
if (searchResults.Any())
{
return searchResults;
}
return emptyList;
如果提取此方法以便返回结果而不是继续,则可以跳过所有
else
s
// Keyword filter
if (string.IsNullOrWhiteSpace(request.Keyword))
{
return emptyList;
}
var searchResults = _items.Where(x => x.Name.Contains(request.Keyword)).ToList();
if (searchResults.Any())
{
return searchResults;
}
searchResults = _items.Where(x => x.Number == request.Keyword).ToList();
if (searchResults.Any())
{
return searchResults;
}
searchResults = _items.Where(x => x.Code == request.Keyword).ToList();
if (searchResults.Any())
{
return searchResults;
}
return emptyList;
如果您的请求与
名称
或编号
或代码
中的任何一个匹配,并且如果您需要所有这些,您的代码可以简化如下
var searchResults = _items.Where(x => x.Name.Contains(request.Keyword) ||
x.Number == request.Keyword ||
x.Code == request.Keyword)
.ToList();
if(!searchResults.Any())
{
_items.Clear();
}
如果您的请求与
名称
或编号
或代码
中的任何一个匹配,并且如果您需要所有这些,您的代码可以简化如下
var searchResults = _items.Where(x => x.Name.Contains(request.Keyword) ||
x.Number == request.Keyword ||
x.Code == request.Keyword)
.ToList();
if(!searchResults.Any())
{
_items.Clear();
}
如果请求匹配
Name
和Number
您想同时返回或..?如果请求匹配Name
和Number
您想同时返回或..?这是一个很好的方法。我发布的代码有点简化。还有其他一些事情。但是我可以直接在查询中提取和使用它们,这是一种很好的方法。我发布的代码有点简化。还有其他一些事情。但是我可以直接在查询中提取和使用它们。