检查ANY类型的数组是否包含元素

时间:2019-06-06 11:53:04

标签: c# arrays

我通过反射收到的两个参数可能是不同的类型。

object array;
object value;

...

array=new int[] { 1,2,3};
value=3;

...

array=new string[] { "one","two","three"};
value="two";

我想找出value是否在array内,无论哪种类型。 以下命令不会编译:

bool isInside=Array.Exists(array, q=>q==value);
  

不能从用法中推断出方法'Array.Exists(T [],Predicate)'的类型参数。尝试显式指定类型参数。

我如何实现我的目标?

4 个答案:

答案 0 :(得分:2)

我想到的一种方法是将数组转换为Array,然后使用for循环搜索它:

var castedArray = (Array)array;
for (int i = 0 ; i < castedArray.Length ; i++) {
    if (castedArray.GetValue(i).Equals(value)) {
        Console.WriteLine("It exists!");
        break;
    }
}

请注意,==在这里不起作用,因为int会被装箱。

如果您的数组只有一维,Array.IndexOf也可以使用(castedArrayvalue),但是如果您还想处理2D或3D数组,则需要检查Rank并使用嵌套的for循环。

答案 1 :(得分:1)

OS仍然是一个数组。因此,让我们先将变量定义为

thenApply()

数组是IEnumerable的,我们可以定义一个扩展类:

Array array;
object value;

并像这样使用它:

public static class EnumerableExtensions
{
    public static bool HasItem(this IEnumerable enumerable, object value)
    {
        return enumerable.OfType<Object>().Any(e => e.Equals(value));
    }
}

如果您需要它为真,则应在HasItem方法中添加一些转换逻辑

答案 2 :(得分:0)

请尝试这个

var dynamicArray = (object[])array;
bool isInside = dynamicArray.Contains(value);

答案 3 :(得分:0)

使用LINQ的强制性答案:

//using System.Linq;
//using System.Reflection;
public static bool IsInArrayUnkownType(object array, object obj)
{
    Type type = array.GetType().GetElementType();
    MethodInfo contains = typeof(System.Linq.Enumerable).GetMethods().Where(m => m.Name == "Contains").First();
    MethodInfo containsUnGenericated = contains.MakeGenericMethod(new[] { type });
    object result = containsUnGenericated.Invoke(null, new object[] { array, obj });
    return (bool)result;
}

编辑:寻找其他解决方案时,我不会真正推荐这个解决方案,因为反射很慢,而其他人做得更好。