将一个值与整个数组进行比较?(C#)

soo*_*ise 14 c# arrays variables equals

假设我有一个C#变量和数组:

int variable_1 = 1;
int[3] array_1 = {1,2,3};
Run Code Online (Sandbox Code Playgroud)

如何在不通过array_1循环的情况下检查variable_1的值是否等于array_1中的任何值?

Jon*_*eet 26

东西必须循环.以下任何一项都有效:

bool exists = array.Contains(variable_1);
bool exists = Array.IndexOf(array_1, variable_1) != -1;
bool exists = Array.Exists(array_1, x => x == variable_1);
bool exists = Array.FindIndex(array_1, x => x == variable_1) != -1;
bool exists = array_1.Any(x => x == variable_1);
Run Code Online (Sandbox Code Playgroud)

使用lambda表达式的所有版本对我来说都有点过分,但如果你发现自己处于一种你不知道你正在寻找的实际值的情况下它们可能是有用的 - 只是一些条件.

如果您知道数组已排序,则可以使用:

bool exists = Array.BinarySearch(array_1, variable_1) >= 0;
Run Code Online (Sandbox Code Playgroud)

那将是O(log n)而不是O(n)(所有其他都是),但它确实需要先对数组进行排序.

就个人而言,我通常会使用第一种形式 - 假设您使用的是.NET 3.5或更高版本.

如果您需要检查多个项目并且数组很大,您可能需要创建一个HashSet<int>:

HashSet<int> hashSet = new HashSet<int>(array_1);
bool exists = hashSet.Contains(variable_1);
Run Code Online (Sandbox Code Playgroud)


Gle*_*lar 18

在3.5及以上

array_1.Contains(variable_1);
Run Code Online (Sandbox Code Playgroud)

或2.0

array_1.IndexOf(variable_1) != -1
Run Code Online (Sandbox Code Playgroud)

更新:节省性能

  • 创建一个新列表只是为了找到一个值对我来说感觉有点过分.即使在2.0中,您也可以使用Array.IndexOf,Array.Exists,Array.FindIndex等. (6认同)