我有一个字符串让我们这样说
var number = "02000123456";
我有一个记录列表,其中包含一个名称/编号。我试图解决这个问题时,我的想法已经空白了,但我想找到第一个与前五位数相匹配的记录,如果没有,那么前四位数如果没有,则为三位数等等。
我最初尝试将前5位数字拆分成数组,然后使用数组作为查找进行查询,然后返回所有匹配项。
我希望在不使用循环的情况下这是可行的。并且只使用Linq。
是否可以将它写在一行或几行中,而无需编写foreach / for循环。
基本上我希望能够去
var record = Context.Numbers.Where(x => x.Designation.StartsWith(number.SubString(0,5)).FirstOrDefault().
但是能够更改SubString()的长度,直到实际填充记录或前5个数字/字符已用尽。
答案 0 :(得分:4)
纯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);
所以这是一个天真的解决方案,但如果你有一本大字典,你需要另一个解决方案来解决这个问题。
答案 1 :(得分:0)
您可以执行以下操作:
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;
}