如何返回具有给定字符串范围的实体列表?



我正试图获得供应商名称列表,其中名称以a和e之间的字符开头。是否有一种方法可以使用LINQ?

我当前的解决方案只是一个很长的if语句

var vendors = _context.Vendors.ToList();
var sortedVendors = new List<Vendor>();
foreach (Vendor vendor in vendors)
{
if (vendor.Name.StartsWith('A') ||
vendor.Name.StartsWith('B') ||
vendor.Name.StartsWith('C') ||
vendor.Name.StartsWith('D') ||
vendor.Name.StartsWith('E'))
{
sortedVendors.Add(vendor);
}
}

这个可以工作,但是很难看,我想知道是否有一个更优雅的解决方案

另一个选择是正则表达式。对于测试字符串是否以a到E开头,正则表达式为^[A-E]

var range = new Regex("^[A-E]");
List<Vendor> sortedVendors = vendors.Where(v => range.IsMatch(v.Name)).ToList();

对于不区分大小写的比较,在创建regex时设置IgnoreCase选项。

var range = new Regex("^[A-E]", regexOptions.IgnoreCase);
List<Vendor> sortedVendors = vendors.Where(v => range.IsMatch(v.Name)).ToList();

要实现模块化,请创建一个接受供应商列表、范围的开始和结束的方法。这个实现不区分大小写:

public List<Vendor> GetRange(List<Vendor> vendorList, char rangeFrom, char rangeThru)
{
var range = new Regex($"^[{rangeFrom}-{rangeThru}]", regexOptions.IgnoreCase);
return vendorList.Where(v => range.IsMatch(v.Name)).ToList();
}

则呼叫sortedList = whatever.GetRange(vendors, 'A', 'E');

我是这样做的

var charsToCheck = new char[] { 'A', 'B', 'C', 'D', 'E' };
var sortedVendors = vendors.Where(vendor => charsToCheck.Contains(vendor[0])).ToList();

为了让它更清晰易读,我想我会这样做:

string startsWiths = "ABCDEF";
IEnumerable<Vendor> query =
from v in vendors
where startsWiths.Any(c => v.Name.StartsWith(c))
select v;

List<Vendor> sortedVendors = query.ToList();

使用模式匹配可以更直观。

_context.Vendors.Where(v => v.Name is { Length: > 0 } && v.Name[0] is 'A' or 'B' or 'C' or 'D' or 'E').ToList()

相关内容

  • 没有找到相关文章

最新更新