【问题标题】:How to search as a dictionary in C# [closed]如何在 C# 中作为字典进行搜索 [关闭]
【发布时间】:2016-11-15 12:20:18
【问题描述】:

我正在尝试在我的术语集合中查找搜索词。

术语集合数组:

[0] "windows"
[1] "dual sim"
[2] "32 gb"
[3] "Intel i5"

现在我搜索以下术语

search term= "32 gb"                 return -> 2 (position of array)
search term ="android 32 gb"         return -> 2 (position of array)
search term ="android mobile 32 gb"  return -> 2 (position of array)
search term= "32 GB"                 return -> 2 (position of array)
search term= "32gb"                  return -> not match 
search term= "dual sim 32"           return -> 1 (position of array)

那么如何在 C# .net 中做到这一点 任何搜索库或搜索词典都可以提供此功能吗

请提供相同的建议/建议

谢谢!

【问题讨论】:

  • 你想在哪个位置,在数组中找到搜索词?
  • 你能分享一下你的代码吗?
  • 当“搜索词”为“windows 32 gb”时应该返回什么?这里的规范似乎非常含糊,当然没有任何形式的minimal reproducible example,不清楚您已经尝试过什么以及解决此问题的具体困难是什么。
  • @sami :-yes 在数组中找到的搜索词
  • 如果您根本没有任何代码,也就是说,如果您甚至懒得尝试解决方案 - 任何解决方案 - 您不应该在此处发布!

标签: c# dictionary levenshtein-distance fuzzy-search


【解决方案1】:

您可以使用Array.FindIndex 来执行此操作。

var array = new string [] {"windows","dual sim","32 gb","Intel i5"};

string searchString = "android 32 gb";
var index = Array.FindIndex(array, x=> searchString.IndexOf(x) >=0);

如果您正在寻找不区分大小写的搜索,请使用它。

var index = Array.FindIndex(array, x=> searchString.IndexOf(x, StringComparison.CurrentCultureIgnoreCase) >=0);

查看Demo

【讨论】:

  • 这是迄今为止唯一符合要求的解决方案,除了您忘记使匹配大小写独立。在最后一行应该是: x => searchString.ToLower().IndexOf(x.ToLower()) >= 0
  • 另外值得注意的是:这将返回第一个匹配项。因此,如果您的 searchString 最终以 "android dual sim 32 gb" 之类的形式出现,它将返回 1,即 dual sim 的索引,因为这是首先被命中的索引。
  • @KalpeshBoghara 你能详细说明一下吗?我同意 Jeremy 的观点,即它与第一个索引匹配,但我觉得这就是要求所说的?我在这里错过了什么吗?
  • @KalpeshBoghara 这怎么没有帮助?你看过哈里发布的演示吗?这符合您的所有要求。
  • @KalpeshBoghara 您是否尝试过第二个选项(不区分大小写的搜索)?
【解决方案2】:

一个简单的逻辑给你:在每次迭代中遍历你的集合(数组)用搜索键检查值,如果两者相等则返回它的索引,否则返回-1(这意味着找不到项目)

public static int GetMatchingIndex(string searchKey)
 {
     string[] MyValues = new string[] { "windows", "dual sim", "32 gb", "Intel i5" };
     for (int i = 0; i < MyValues.Count(); i++)
     {
          if (searchKey.IndexOf(MyValues[i], StringComparison.InvariantCultureIgnoreCase) >= 0)
             return i;
     }
     return -1;
 }

你可以像下面这样调用这个方法(Example Here):

string searchTerm = "32 gb";
int itemIndex= GetMatchingIndex(searchTerm); // This will give 2

【讨论】:

  • 我的搜索词是“android intel i5”,返回是-1,错误的输出应该是3
  • @KalpeshBoghara 我在帖子中有更新,将比较更改为:` if (searchKey.IndexOf(MyValues[i], StringComparison.InvariantCultureIgnoreCase) >= 0)` 看看跨度>
【解决方案3】:
int index =  Array.IndexOf(YourCollection,  YourCollection.Where(x=>x.Contains("32 gb")).FirstOrDefault());

【讨论】:

    【解决方案4】:
    public int SearchArray(string searchTerm) {
        return arrayList.IndexOf(
        arrayList.Cast<string>()
        .FirstOrDefault(i => searchTerm.Contains(i)));
    }
    

    【讨论】:

    • 为什么使用 ArrayList 而不是 List 或 string[] ?此解决方案也具有不必要的高复杂性。
    • 你应该更好地解释你的答案。不解释就发布代码是不行的。 OP 应该理解答案的含义。
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多