C# 根据字符串的开头或字符串为空查找第一条记录

C# 根据字符串的开头或字符串为空查找第一条记录,c#,linq,C#,Linq,我有一根绳子,比如说 var number = "02000123456"; 我有一份记录清单,上面有一个名称/编号。我的脑子一片空白,想弄明白这一点,但我想找到第一条记录,匹配前五位数字,如果没有,那么匹配前四位数字,如果没有,那么匹配三位数字,依此类推 我最初尝试将前5位数字拆分为一个数组,然后使用该数组进行查询,但随后返回所有匹配项 我希望这在不使用循环的情况下是可行的。只需使用Linq 是否可以在不需要编写foreach/for循环的情况下,在一行或几行中编写此代码 基本上我想去 va

我有一根绳子,比如说

var number = "02000123456";
我有一份记录清单,上面有一个名称/编号。我的脑子一片空白,想弄明白这一点,但我想找到第一条记录,匹配前五位数字,如果没有,那么匹配前四位数字,如果没有,那么匹配三位数字,依此类推

我最初尝试将前5位数字拆分为一个数组,然后使用该数组进行查询,但随后返回所有匹配项


我希望这在不使用循环的情况下是可行的。只需使用Linq

是否可以在不需要编写foreach/for循环的情况下,在一行或几行中编写此代码

基本上我想去

var record = Context.Numbers.Where(x => x.Designation.StartsWith(number.SubString(0,5)).FirstOrDefault().

但随后可以更改子字符串()的长度,直到记录实际填充或前5位/字符已用尽。

您可以执行以下操作:

    Data GetMatch(List<Data> dataList, string number)
    {
        var match = new Data();
        int maxLength = 5;
        while (maxLength > 0)
        {
            if (dataList.Any(p => p.Designation.StartsWith(number.Substring(0, maxLength))))
            {
                match = dataList.FirstOrDefault(p => p.Designation.StartsWith(number.Substring(0, maxLength)));
                break;
            }
            maxLength--;
        }
        return match;
    }
datagetmatch(列表dataList,字符串编号)
{
var match=新数据();
int maxLength=5;
而(最大长度>0)
{
if(dataList.Any(p=>p.Designation.StartsWith(number.Substring(0,maxLength)))
{
match=dataList.FirstOrDefault(p=>p.Designation.StartsWith(number.Substring(0,maxLength));
打破
}
最大长度--;
}
复赛;
}

纯Linq解决方案是

new []{5,4,3,2,1}.Select(len => Context.Numbers.FirstOrDefault(x => x.Designation.StartsWith(number.SubString(0, len)))).FirstOrDefault(i => i != null);
通过Enumerable.Range初始化另一个基序列

Enumerable.Range(1, 5).Reverse().Select(len => Context.Numbers.FirstOrDefault(x => x.Designation.StartsWith(number.SubString(0, len)))).FirstOrDefault(i => i != null);

所以这是一个简单的解决方案,但是如果你有一个大字典,你需要另一个解决方案来解决这个问题。

“我希望这是可行的,不使用循环。只使用Linq。”-仅供参考,Linq也只在内部使用循环。@RexM啊,我明白了,我可以重新措辞,说用尽可能少的代码编写,不必编写foreach/for循环。需要技巧的是,我可以看到两种方法。1) 搜索所有以第一个字符开头的记录,然后搜索该列表中以前两个字符开头的记录,依此类推,直到得到一个空列表,或者得到完整的5个字符的子字符串。或者2)首先搜索所有5个字符,然后,如果列表为空,搜索4个字符,依此类推。哪个更有效可能取决于您认为未命中与命中的可能性。您不能用调用
Enumerable.Range
?几秒钟前我已将范围替换为数组:)问题的标题是“查找第一条记录”更改为第一条记录。