查看变量是否等于这些字符串中任何一个的最有效方法

时间:2011-08-26 14:36:34

标签: c#

我有一个包含五个字符串的列表。我想看看传入的变量是否等于这五个字符串中的任何一个。有没有比做if / else或case语句更好的方法?

4 个答案:

答案 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)