我从第三方库中找回“string []”。我想做一个包含就可以了。这样做最有效的方法是什么?
答案 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); });
}
}
希望这有帮助。