如何将对象(即数组)转换回数组(或更通用的内容)
本文关键字:数组 转换 对象 | 更新日期: 2023-09-27 18:30:18
我想要一个比较方法,该方法接受两个对象并在它们相等或不相等时返回。
在方法中,我区分了不同的数据类型,以将适当的比较方法应用于对象。
问题是,我移交了两个数组(例如int[])并想使用现在SequenceEqual()
,所以我必须将对象更改为一些可以正确应用于它们的通用序列/列表/数组SequenceEqual()
。
目前,我现在不知道如何将数据类型正确更改为执行此操作的通用类型。
IEnumerable<object>
会SequenceEqual()
方法,但是如果我这样做,source
和test
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);
}
}
Compare()
是 Object 的扩展方法,所以我这样做来调用它:
int[] a = new int[] { 1, 2, 3 };
int[] b = new int[] { 1, 2, 3 };
a.Compare(b);
我该怎么做才能将两个对象(即数组)视为数组,以便我可以使用 SequenceEqual()
?
Array
实现了IEnumerable
,因此您可以执行以下操作:
IEnumerable<object> source = ((IEnumerable)o1).Cast<object>();
IEnumerable<object> test = ((IEnumerable)o2).Cast<object>();
尝试添加另一个重载,如下所示:
public static bool Compare<T>(this T[] o1, T[] o2)
{
return o1.SequenceEqual(o2);
}
来处理数组。
我认为你应该先把它投射到一个数组,然后将其转换为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;
}
}