假设我有以下对象:
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 ) );
}
}
..它应该导致以下结果:
我在如何在var result = lookup.FirstOrDefault( x => x );
方法的FindMatch
行编写LINQ查询时遇到问题,以实现此目标。
目前,我在一个带有开关案例的巨型for
循环中有这个,以按递减顺序检查数字的长度(例如,检查&#34; 123456123&#34;,然后&#34; 12345612& #34;,然后&#34; 1234561&#34;依此类推)直到找到匹配项。我想利用LINQ的强大功能,因为我发现它的循环处理速度比传统foreach()
快得多。
答案 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
。