我会尽力说出最好的话。我希望有多个因素,并使它们等于一个可重用因子。作为一个例子,我正在做一个语音识别项目,我希望sup代表一个单词列表。
EX :(甚至不知道if语句是否适合这项工作。)
var lower = speech.ToLower();
{
if (lower.Contains("hello") || lower.Contains("hi") || lower.Contains("hey"))
{
object == sup;
}
}
这种方式现在代表你好,嗨,嘿,让事情变得更简单。再一次,我甚至不知道if语句是否适合该作业,或者是否支持对象适合此类场景。我希望这是有道理的,谢谢你!
答案 0 :(得分: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>
作为查找值,这样您就可以将多个关键字链接到相同的搜索结果。
如果您要输入由多个值组成的字符串,只需添加一个外部循环:
整个重写:
此示例假定您有一个输入字符串。您的要求是检查此输入字符串是否包含任何一组单词。每组单词都应该能够用一个单词来引用。
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;
}
}
输出:
它有两个!
这种方法的好处:添加一组新单词就像在词典中添加一个条目一样简单。非常高的可扩展性!你也可以让多个值引用同一个列表(如果你想创建“howdie”,它应该引用与“sup”相同的值,你可以将它添加到列表中并完成)。
答案 1 :(得分:1)
如果您想要多个输入指向一个输出,那么Dictionary
看起来是个不错的选择。请注意constructor
我使用StringComparer.OrdinalIgnoreCase
作为IEqualityComparer<string>
获取StringComparer
对象,该对象执行不区分大小写的序数字符串比较,因此您不需要使用{在Sting.ToLower()
上使用密钥时{1}}。
Dictionary
要找到正确的响应,您可以循环遍历Dictionary<string,string> simple = new Dictionary<string,string>(StringComparer.OrdinalIgnoreCase)
{
{"hello", "sup"},
{"hi", "sup"},
{"hey", "sup"}
}
,如下所示。由于你没有将密钥传递到字典中,我认为你需要在这里使用ToLower()。
KeysCollection
答案 2 :(得分: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());
}
}
}