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

m1m5dgzv  于 2022-12-06  发布在  其他
关注(0)|答案(4)|浏览(135)

我试图获得一个供应商名称列表,其中名称以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);
    }
}

这是工程,但可怕的,我很想知道,如果有一个更优雅的解决方案

lstz6jyr

lstz6jyr1#

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

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();
jucafojl

jucafojl2#

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

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

du7egjpx3#

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

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

对于不区分大小写的比较,请在创建正则表达式时设置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');

xxls0lw8

xxls0lw84#

我会这么做

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

相关问题