2

我想要一个比较方法,它接受两个对象并返回它们是否相等。

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

问题是,我移交了两个数组(例如 int[])并想现在使用SequenceEqual(),所以我必须将对象更改为可以SequenceEqual()正确应用于它们的一些通用序列/列表/数组。

目前我不知道如何将数据类型正确地更改为通用的东西。

AnIEnumerable<object>会有方法SequenceEqual(),但如果我这样做,source并且testnull

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);
    }
}

Compare()是对象的扩展方法,所以我这样做是为了调用它:

int[] a = new int[] { 1, 2, 3 };
int[] b = new int[] { 1, 2, 3 };

a.Compare(b);

我必须做什么才能将两个对象(即数组)视为数组以便我可以使用SequenceEqual()

4

3 回答 3

6

Array实现IEnumerable,因此您可以执行以下操作:

IEnumerable<object> source = ((IEnumerable)o1).Cast<object>();
IEnumerable<object> test = ((IEnumerable)o2).Cast<object>();
于 2013-09-05T10:38:29.980 回答
1

尝试像这样添加另一个重载:

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

处理数组。

于 2013-09-05T10:40:37.550 回答
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;
    }
}
于 2013-09-05T10:48:01.923 回答