使用string []进行包含的最快方法

时间:2009-01-03 15:46:30

标签: c#

我从第三方库中找回“string []”。我想做一个包含就可以了。这样做最有效的方法是什么?

6 个答案:

答案 0 :(得分:9)

Array.IndexOf:

bool contains = Array.IndexOf(arr, value) >= 0;

或者只使用LINQ:

bool contains = arr.Contains(value);

对于大多数用途,LINQ应该“足够快”。

答案 1 :(得分:7)

如果您只检查一次,请使用Array.IndexOf或像Marc建议的LINQ Contains方法。如果您多次检查,首先将字符串数组转换为HashSet<string>可能会更快。

答案 2 :(得分:2)

除非您知道String数组按特定顺序排序,否则您可以做的最有效的事情是线性算法(即比较数组中的每个字符串,直到找到匹配或数组的结尾。

如果对数组进行排序,则二进制搜索要快得多。

优化算法的另一种方法(尽管不降低复杂性)是对字符串比较进行矢量化。

答案 3 :(得分:1)

如果绝对速度是您的关注点,我相当确定for循环更快。即,

for (int i = 0; i < arr.Length; ++i)
  if (arr[i] == value) return true;
return false;

答案 4 :(得分:1)

如果您要搜索一次或两次,请使用线性搜索或IndexOf。

如果您正在搜索几次,请将字符串放入HashSet。

如果您正在以时间关键的方式搜索数十亿次,请使用HashSet并自行管理其存储桶数。

答案 5 :(得分:1)

您可以使用 IEnumerable.Foreach 自定义扩展程序

public static class CollectionExtensions
{
    public static void ForEach<T>(this IEnumerable list, Action<T> action)
    {
        foreach (T item in list)
        {
            action(item);
        }
    }
}


class Program
{
    static void Main(string[] args)
    {
        String[] list = new String[] { "Word1", "Word2", "Word3" };

        list.ForEach<String>(p => Console.WriteLine(p));
        list.ForEach(delegate(String p) { Console.WriteLine(p); });
    }
}

希望这有帮助。