我在 C# 中有一个供应商列表,它们都具有 Name 属性。我想允许用户通过搜索名称来过滤该列表。过滤器字符串可以是部分匹配或完全匹配。但是,如果结果列表包含完全匹配,则它应该在列表中的位置为零,之后是所有部分匹配。
我可以使用 linq 和 lambdas 很容易地获得子列表,但我不得不求助于创建第二个列表(如果存在完全匹配),添加它,然后添加其余匹配而不确切的一个。感觉很不雅观。有更容易的方法吗?我当前的代码(从内存中完成,因此可能无法编译):
List<Vendor> temp = vendors.Where(v => v.Name.ToUpper().Contains(vendorNameSearch)).ToList();
Vendor exactMatch = vendors.Single(v => v.Name.ToUpper().Equals(vendorNameSearch));
if(null == exactMatch){return temp;}
else
{
List<Vendor> temp1 = new List<Vendor>();
temp1.Add(exactMatch);
temp1.AddRange(temp.Remove(exactMatch));
return temp1;
}
最佳答案
如何开发一个计算 Levenshtein 的 StringComparer? distance——对于精确匹配,这应该是零——并按升序排列结果。通过这种方式,您首先获得完全匹配,其余结果按与搜索字符串的相似性(至少一种衡量标准)排序。
var list = vendors.Where( v => v.Name.ToUpper().Contains( vendorNameSearch ) )
.OrderBy( v => ComputeLevenshtein( v.Name.ToUpper(),
vendorNameSearch ) );
或者,您可以创建一个比较器,以 int.MinValue 为精确匹配项,所有其他值为 CompareTo() 的结果。这也将首先排序完全匹配。
关于c# - 选择列表中特定元素位于列表首位的列表子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1258269/