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 成为对象是否适合这种类型的场景。我希望这是有道理的,谢谢!
当然,创建一个字典,其中包含一侧的值列表和另一侧的响应。
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());
}
}
}