如何将一个Object(即一个数组)转换回一个数组(或更通用的东西)?

时间:2013-09-05 10:29:06

标签: c# arrays casting

我想要一个带有两个对象的比较方法,如果它们相同或不相等则返回。

在方法内部,我区分不同的数据类型,以便将适当的比较方法应用于对象。

问题是,我切换了两个数组(例如int [])并想现在使用SequenceEqual(),所以我必须将对象更改为可以应用{{1}的通用序列/列表/数组正确对待他们。

目前我还没有如何正确地将数据类型更改为通用的数据类型。

SequenceEqual()会使用方法IEnumerable<object>,但如果我这样做,则SequenceEqual()sourcetest

null

public static bool Compare(this object o1, object o2) { if (o1 is Array && o2 is Array) { // special array handling IEnumerable<object> source = o1 as IEnumerable<object>; IEnumerable<object> test = o2 as IEnumerable<object>; // this fails now, because source and test are null. return source.SequenceEqual(test); } else { return o1.Equals(o2); } } 是Object的Extension方法,所以我这样做是为了调用它:

Compare()

我需要做些什么才能将两个对象(即数组)作为数组处理,以便我可以使用int[] a = new int[] { 1, 2, 3 }; int[] b = new int[] { 1, 2, 3 }; a.Compare(b);

3 个答案:

答案 0 :(得分:6)

Array实施IEnumerable,您可以这样做:

IEnumerable<object> source = ((IEnumerable)o1).Cast<object>();
IEnumerable<object> test = ((IEnumerable)o2).Cast<object>();

答案 1 :(得分:1)

尝试添加另一个重载,如下所示:

public static bool Compare<T>(this T[] o1, T[] o2)
{
    return o1.SequenceEqual(o2);
}

处理数组。

答案 2 :(得分:0)

我认为你应该先将它转换为数组,然后将其转换为IEnumerable,所以答案是:

public static bool Compare(this object o1, object o2)
{
    if (o1 is Array && o2 is Array)
    {
        // special array handling
        IEnumerable<object> source = (o1 as Array).A();
        IEnumerable<object> test = (o2 as Array).A();

        // this fails now, because source and test are null.
        return source.SequenceEqual(test);
    }
    else
    {
        return o1.Equals(o2);
    }

}
public static IEnumerable<object> A(this Array a)
{
    foreach (var item in a)
    {
        yield return item;
    }
}