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
?几秒钟前我已将范围替换为数组:)问题的标题是“查找第一条记录”更改为第一条记录。