什么是测试项目数组是否在预定义数组中的最佳方法

时间:2013-03-15 17:18:16

标签: c# arrays ienumerable

通过给出一个字符串数组,我想测试数组中的每个元素是否包含在预定义的字符串数组中。

例如:

var a = new[] { "test1", "test2" };

var b = new[] { "test1", "test4" };

var c = new[] { "test1", "test3", "test1", "test3" };

var predefined = new[] { "test1", "test2", "test3" };

变量a和c将返回true,b将返回false。

C#代码最有效的方法是什么?

2 个答案:

答案 0 :(得分:7)

订购对您有用吗?如果没有,我只使用LINQ:

if (!a.Except(predefined).Any())
{
    // predefined contains every element of a
    // (Way to read this: there is no element of a which isn't also in predefined)
}

通常为O(N + M)而不是All ... Contains解决方案,即O(N * M)。当然,这并未说明绝对性能。如果您使用的是小型馆藏,All ... Contains实际上可能会更快。随着涉及的集合越来越大,这种情况越来越快。

编辑:如评论中所述,如果您可以从HashSet<T>创建predefined并重复使用它,那么效率会更高......实际上也更具可读性:

var predefinedSet = new HashSet<string>(predefined);
...

if (predefinedSet.IsSupersetOf(a))
{
    ...
}

答案 1 :(得分:2)

不确定最有效但最容易阅读的标准代码是否

arrayToCheck.All(a => predefined.Contains(a))