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

时间:2014-06-09 13:37:53

标签: c# linq

我有一个字符串让我们这样说

var number = "02000123456";

我有一个记录列表,其中包含一个名称/编号。我试图解决这个问题时,我的想法已经空白了,但我想找到第一个与前五位数相匹配的记录,如果没有,那么前四位数如果没有,则为三位数等等。

我最初尝试将前5位数字拆分成数组,然后使用数组作为查找进行查询,然后返回所有匹配项。

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

是否可以将它写在一行或几行中,而无需编写foreach / for循环。

基本上我希望能够去

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

但是能够更改SubString()的长度,直到实际填充记录或前5个数字/字符已用尽。

2 个答案:

答案 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;
    }