我有一个包含五个字符串的列表。我想看看传入的变量是否等于这五个字符串中的任何一个。有没有比做if / else或case语句更好的方法?
答案 0 :(得分:5)
假设我理解你的意思,这是一个丑陋但易于理解的方法,我们将字符串放入列表中:
var data = new List<string>();
// add some:
data.Add("Stack");
data.Add("Overflow");
data.Add("Is");
data.Add("Awesome");
string test = "Stack";
// does our list contain our test?
bool found = data.Contains(test);
答案 1 :(得分:2)
我相信使用 HashSet 会更有效率!
使用下面显示的测试程序,我得到以下结果:
列出时间:558哈希时间:150
列出时间:150个哈希时间:7
列出时间:138哈希时间:7
列出时间:138哈希时间:7
列出时间:142哈希时间:3
列出时间:138哈希时间:3
列出时间:142哈希时间:3
列出时间:142哈希时间:3
列出时间:138哈希时间:7
列表时间:223个哈希时间:7
是的,这可能是列表中最糟糕的情况,因为我的测试是在寻找序列中的最后一个条目,但它确实是重点。 Contains()必须线性搜索整个链表(这就是List是什么),这是 O(n),其中HashSet使用哈希函数来查找键,这是一个恒定的时间操作 O(1)
这是我的测试程序:
static void Main(string[] args)
{
var list = new List<string>();
var hash = new HashSet<string>();
for (int i = 0; i < 1000; i++)
{
list.Add(i.ToString());
hash.Add(i.ToString());
}
Stopwatch sw = new Stopwatch();
for (int j = 0; j < 10; j++)
{
sw.Start();
bool isFound1 = list.Contains("999");
sw.Stop();
var time1 = sw.Elapsed;
sw.Reset();
sw.Start();
bool isFound2 = hash.Contains("999");
sw.Stop();
var time2 = sw.Elapsed;
sw.Reset();
Console.WriteLine("list time: " + time1.Ticks);
Console.WriteLine("hash time: " + time2.Ticks);
Console.WriteLine();
}
}
答案 2 :(得分:1)
假设传递的变量也是一个字符串,您可能需要查看this个问题。只需将您的五个字符串放在string[]
(或List
或任何实现IEnumerable
的内容中),然后调用IEnumerable<string>.Contains
以查看它是否等于任何字符串。 (请注意,这不会告诉您它与哪个字符串相同,但是因为您实际上没有要求它...)
答案 3 :(得分:0)