1

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

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

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

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

4

3 回答 3

1

如果您希望多个输入指向一个输出,那么 aDictionary看起来是个不错的选择。请注意,在constructorStringComparer.OrdinalIgnoreCase用作IEqualityComparer<string>which 获取一个StringComparer对象,该对象执行不区分大小写的序号字符串比较,因此Sting.ToLower()在使用Dictionary.

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;
    }
} 
于 2013-10-19T23:08:44.250 回答
1

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

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>for 查找值,以便您可以将多个关键字链接到相同的搜索结果。

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

整个重写:

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

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”,您可以将其添加到列表中并完成)。

于 2013-10-19T22:13:23.710 回答
0

基本上是哈里森所说的,但我会使用如下所示的 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());
        }
    }
}
于 2013-10-20T00:02:01.210 回答