如何使用LINQ返回字符串第一部分的最长匹配?

时间:2016-08-01 19:20:40

标签: c# linq

假设我有以下对象:

public struct Lookup {
    public string code;
    public string name;
}

public static List<Lookup> lookup =new List<Lookup>() {
    new Lookup {
        code = "12345",
        name = "abc"
    },
    new Lookup {
        code = "123",
        name = "def"
    },
    new Lookup {
        code = "123456",
        name = "ghi"
    }
};

public static Lookup FindMatch(string valueToSearchInLinq) {
    // Find the first result or null if no match found
    var result = lookup.FirstOrDefault( x => x );
    return result;
}

运行以下内容时:

List<string> searchFor = new List<string>() { "123111117", "123456123", "12159785" };
foreach(var s in searchFor) {
   var r = FindMatch(s);
   if(r.code == null) {
       System.Diagnostics.Debug.WriteLine(string.Format("No match for {0}", s));
   } else {
       System.Diagnostics.Debug.WriteLine( string.Format( "{0} is {1}", s, r.name ) );
   }
}

..它应该导致以下结果:

  • 123111117是def
  • 123456123是ghi
  • 不匹配12159785

我在如何在var result = lookup.FirstOrDefault( x => x );方法的FindMatch行编写LINQ查询时遇到问题,以实现此目标。

目前,我在一个带有开关案例的巨型for循环中有这个,以按递减顺序检查数字的长度(例如,检查&#34; 123456123&#34;,然后&#34; 12345612& #34;,然后&#34; 1234561&#34;依此类推)直到找到匹配项。我想利用LINQ的强大功能,因为我发现它的循环处理速度比传统foreach()快得多。

1 个答案:

答案 0 :(得分:0)

  

如何使用LINQ返回a的第一部分的最长匹配   串

许多评论建议您可以依赖匹配计数。由于您想匹配第一部分,我建议使用StartWith

public static Lookup FindMatch(string valueToSearchInLinq)
{
    // Find the first result or null if no match found
    var result = lookup.Select(x=> new {x, count = valueToSearchInLinq.StartsWith(x.code)? x.code.Length : -1})
                       .OrderByDescending(x=>x.count);

    // Check for any single match.
    return result.All(x=>x.count <0)? new Lookup() : result.First().x;
}

// Input
List<string> searchFor = new List<string>() { "123111117", "123456123", "12159785" };

// You get this output
123111117 is def
123456123 is ghi
No match for 12159785

一个提示,有一个重载方法接受比较类型,如果你想忽略大小写等,请探索此选项...

选中Demo