检查数组中是否存在某个元素的代码未按预期工作。(C#)

问题描述 投票:0回答:4

所以我运行这段代码:

  public class whatever
    {
        public  bool checkArray(object[] a, object x)
        {
            int goThrowArray = 0;
            bool res = false;
            while (goThrowArray != a.Length)
            {
                object tempVar  = a[goThrowArray];
                if (tempVar == x) 
                {
                    res = true;
                }
                goThrowArray++;
            }
            return res;
        }
    }

即使 x 等于 a[goThrowArray] 它仍然返回错误... 例子:

whatever checking = new whatever();
object[] s = { 1,2,3,54,62};
Console.Write(checking.checkArray(s,3));

And then we run rest of the code in the debugger

我尝试更改数据类型、调试等。 但无论如何它仍然返回 false.

c# console-application
4个回答
1
投票

问题是

object
将整数封装在一个对象中。这个过程称为boxing。对象通过引用相等性进行测试。因此,数组中的对象与您正在测试的对象不同。即使两者包含相同的值。

解决方案是与

Equals
方法进行比较,该方法被int覆盖:

if (tempVar.Equals(x)) { res = true; }
如果你想混合不同类型的对象,你可以使用 

object

 数组,比如 
int
double
string
 对象。但是,如果您只使用整数,请改用 
int[]
。那么你就不会有这个问题了。

您甚至可以使您的

方法通用,以便它适用于不同类型的数组:

public bool CheckArray<T>(T[] a, T x) { ... }
遍历数组最常见的方法是使用 

for 语句

此外,您可以在找到匹配的条目后立即返回。把这些放在一起:

public bool CheckArray<T>(T[] a, T x) { for (int i = 0; i < a.Length; i++) { if (a[i].Equals(x)) { return true; } } return false; }
测试:

whatever checking = new whatever(); object[] a1 = { 1, 2, 3, 54, 62 }; int[] a2 = { 1, 2, 3, 54, 62 }; string[] a3 = { "hello", "world" }; Console.WriteLine(checking.CheckArray(a1, 3)); Console.WriteLine(checking.CheckArray(a2, 3)); Console.WriteLine(checking.CheckArray(a3, "world"));
    

0
投票
由于

tempVar

x
 属于 
object
 类型,== 运算符解析为 
object.ReferenceEquals()
 对于盒装值的实例总是返回 false。在您的函数签名中将其更改为 
tempVar.Equals(x)
 或将 
object
 更改为 
int
。当您知道正确的类型(在本例中为 int)时,您不应该使用 object,这不仅是由于诸如此类的陷阱,而且还出于性能原因。


0
投票
当您找到所需的对象时,

break

 while 循环。您的代码只检查最后一项

public class whatever { public bool checkArray(object[] a, object x) { int goThrowArray = 0; bool res = false; while (goThrowArray != a.Length) { object tempVar = a[goThrowArray]; if (tempVar == x) { res = true; break; } goThrowArray++; } return res; } }
    

0
投票
而不是使用

object

,你应该使该方法通用,例如

public bool DoesArrayContainItem<T>(T[] a, T x) { for (var i = 0; i < a.Length; i++) { if (a[i] == x) { return true; } } return false; }
一方面,这将迫使您传递与数组相同类型的项目。使用您拥有的代码,理论上您可以传入一个 

int

 和一个 
DataTable
 的数组。做那个检查是没有意义的,这个方法不会让你。它还会将每种类型视为自身,而不是将所有类型视为
object
。这意味着值类型被视为值类型而不是被装箱。

© www.soinside.com 2019 - 2024. All rights reserved.