c# - 选择列表中特定元素位于列表首位的列表子集

标签 c# linq

我在 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/

相关文章:

c#发布后没有相关的app.config

c# - Fluent Nhibernate 错误外键

c# - 检查URL是否存在-HTTP请求始终返回异常

c# - 需要 .NET 串行端口帮助,主要是在多个 "packets"中接收到的数据

c# - AcceptAllChanges 导致 Entity Framework ... 不接受更改?

linq - 使用 NHibernate 3.0 QueryOver 或 LINQ 提供程序的权衡

javascript - 使用 HTTP POST 的 AWS S3 浏览器上传提供无效签名

c# - LINQ - SkipWhile 坏了吗?

c# - Linq to Entities Left outer join分组到一个集合中

c# 语法和 Linq,IQueryable