public static IEnumerable<KeyValuePair<T, Double>> LCS<T>(this IEnumerable<T> list, String keys, Func<T, String> keySelector)
{
var rs = new List<KeyValuePair<T, Double>>();
if (list == null || !list.Any()) return rs;
if (keys.IsNullOrWhiteSpace()) return rs;
if (keySelector == null) throw new ArgumentNullException(nameof(keySelector));
var ks = keys.Split(" ").OrderBy(_ => _.Length).ToArray();
// 计算每个项到关键字的距离
foreach (var item in list)
{
var name = keySelector(item);
if (name.IsNullOrEmpty()) continue;
var dist = LCSDistance(name, ks);
if (dist >= 0)
{
var val = (Double)dist / name.Length;
rs.Add(new KeyValuePair<T, Double>(item, val));
}
}
//return rs.OrderBy(e => e.Value);
return rs;
}