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
您想同时返回或..?这是一个很好的方法。我发布的代码有点简化。还有其他一些事情。但是我可以直接在查询中提取和使用它们,这是一种很好的方法。我发布的代码有点简化。还有其他一些事情。但是我可以直接在查询中提取和使用它们。