C# 将因素合二为一

本文关键字:合二为一 | 更新日期: 2023-09-27 18:36:08

我会尽力说出来。我想有多个因素,并使它们等于一个可重用的因素。举个例子,我正在做一个语音识别项目,我希望sup代表一个单词列表。

EX:(甚至不知道if语句是否适合这项工作。

var lower = speech.ToLower();
{
  if (lower.Contains("hello") || lower.Contains("hi") || lower.Contains("hey"))                    
    {                        
      object == sup;                    
    }
}

这种方式 sup 现在代表你好、嗨和嘿,让事情变得更加简单。再一次,我什至不知道 if 语句是否适合这项工作,或者让 sup 成为对象是否适合这种类型的场景。我希望这是有道理的,谢谢!

C# 将因素合二为一

当然,创建一个字典,其中包含一侧的值列表和另一侧的响应。

private IDictionary<List<String>, List<String>> _responses = new Dictionary<List<String>, List<String>>();
_responses.Add(
            new List<String> { "Hello there!", "Hey mate", "Hi!" }},
            new List<String> { "sup" );
_responses.Add(
            new List<String> { "Buddy", "Mate", "Hombre" }},
            new List<String> { "sup");

现在为了检索一些东西:

foreach(var keyword in _responses.Keys){
 if(keywords.Contains("sup"){
  return _responses[keyword];
 }
}

搜索"sup"将返回相应响应的列表。我也对查找值使用了List<String>,以便您可以将多个关键字链接到相同的搜索结果。

如果要输入由多个值组成的字符串,只需向其添加一个外部循环:

完全重写:

此示例假定您有一个输入字符串。您的要求是检查此输入字符串是否包含一组单词中的任何一个。每组单词都应该能够通过单个单词引用。

void Main()
{
    var babel = new Babel("hi homies, this is for my mate out there.");
    if(babel.HasAnswer("sup") && babel.HasAnswer("friend")){
        Console.WriteLine ("It has both!");
    } else {
        Console.WriteLine ("Boo Jeroen you suck");
    }
}
public class Babel {
    private IDictionary<List<String>, List<String>> _responses = new Dictionary<List<String>, List<String>>();
    private String query;
    public Babel(string query){
        this.query = query;
        _responses.Add(
                new List<String> { "sup" },
                new List<String> { "hello", "hey", "hi"});
        _responses.Add(
                new List<String> {"friend" },
                new List<String> { "buddy", "mate", "hombre" });
    }
    public bool HasAnswer(string input){
     foreach(var token in input.Split(' ')) {
      foreach(var keyword in _responses.Keys){
        if(keyword.Contains(token)){
         return ContainsAny(_responses[keyword]);
        }
      }
     } 
     return false;
    }
    private bool ContainsAny(List<String> toCompare){
        foreach(string item in toCompare){
            foreach(string token in query.Split(' ')){
                if(token == item) return true;
            }
        }
        return false;               
    }

}

输出:

它两者兼而有之!

这种方法的好处:添加新的单词组就像向字典中添加条目一样简单。非常高的可扩展性!您也可以让多个值引用同一个列表(如果您想创建应该引用与"sup"相同的值的"howdie",您可以将其添加到列表中即可完成)。

如果你想让多个输入指向一个输出,那么Dictionary看起来是一个不错的选择。 请注意,在constructor中,我使用 StringComparer.OrdinalIgnoreCase 作为 IEqualityComparer<string> 获取一个执行不区分大小写的序号字符串比较的 StringComparer 对象,因此您在Dictionary上使用键时无需弄乱Sting.ToLower()

Dictionary<string,string> simple = new Dictionary<string,string>(StringComparer.OrdinalIgnoreCase)
{
    {"hello", "sup"},
    {"hi", "sup"},
    {"hey", "sup"}
}

要找到正确的响应,您可以按如下方式遍历KeysCollection。 由于您没有将密钥传递到字典中,我认为您需要在此处使用 ToLower()。

string response = string.Empty;
foreach (string s in simple.Keys)
{
    if (speech.ToLower().Contains(s.ToLower()))
    {
        response = simple[s];
        break;
    }
} 

基本上是Harrison所说的,但我会使用TryGetValue,如下所示。

using System;
using System.Collections.Generic;
namespace Test
{
    class Program
    {
        interface Word
        {
            String GetResponse();
        }
        public class Sup : Word
        {
            public String GetResponse()
            {
                return "Hello back to you!";
            }
        }
        public class Lates : Word
        {
            public String GetResponse()
            {
                return "Sorry to see you go.";
            }
        }
        static void Main(string[] args)
        {
            var sup = new Sup();
            var lates = new Lates();
            var mapping = new Dictionary<String, Word>(StringComparer.OrdinalIgnoreCase)
            {
                {"hi", sup},
                {"hello", sup},
                {"hey", sup},
                {"bye", lates},
                {"later", lates},
                {"astalavista", lates},
            };
            Word word;
            if (mapping.TryGetValue("HELLO", out word))
                Console.WriteLine(word.GetResponse());
            if (mapping.TryGetValue("astalavista", out word))
                Console.WriteLine(word.GetResponse());
            if (mapping.TryGetValue("blaglarg", out word))
                Console.WriteLine(word.GetResponse());
        }
    }
}