首先,我想说一下我在编码方面还很新,所以如果代码看起来很恐怖,请不要杀死我。
好的,所以问题是我试图创建一个通用函数,目的是获取两个排序数组并将它们合并为一个新的排序数组。
我面临的问题是尝试在函数中使用if,并且不允许我使用<
操作数。
public object[] mergeTwoSorted<Tone, Ttwo>(Tone[] array, Ttwo[] array2)
{
object[] mergedArray = new object[array.Length + array2.Length];
for (int i = 0; i < mergedArray.Length; i++)
{
if (array is ValueType && array2 is ValueType)
{
if (array[i] > array2[i])
}
}
}
关于如何解决此问题的任何想法?
答案 0 :(得分:6)
首先,我想说一下我在编码方面还很新,所以如果代码看起来很恐怖,请不要杀死我。
到目前为止,看起来还算合理。看起来您要执行的操作是采用两个不同类型的两个 sorted 数组,但是这两种类型之间存在排序关系。然后,您将两个数组合并到一个对象数组中,以使两个数组中的对象仍保持相同的顺序,但它们相互交错以匹配类型间的顺序关系,是吗?
这是不寻常的事情,但是有可能。
如果这不是您要执行的操作,则需要停止并重新设计代码。特别是,如果您打算获取两个 same 类型的数组,那么您必须具有 one 类型参数,而不是 two ,并且您必须将T
的数组作为输出,而不是object
的数组。
问题在于,在C#中通常无法表达“我在这两种类型之间具有排序关系”。您必须提供执行此操作的功能。传统上,我们提供一个接受两种类型并返回整数的函数:如果第一个较小,则返回-1;如果第二个较小,则返回1;如果它们相等,则返回0。
如果有,您的方法将变为:
public static object[] MergeTwoSorted<TOne, TTwo> (
TOne[] items1,
TTwo[] items2,
Func<TOne, TTwo, int> comparer)
{
请注意,我们在这里使用标准C#约定。方法以大写字母开头,类型参数为TSomething
,依此类推。 Func<A, B, C>
是一个函数,它接受一个A
,一个B
并返回一个C
。不操纵其类实例的方法是static
。
请注意,无需以事物的名称重新声明事物的类型。说什么是事物逻辑上,而不是它的存储方式:
object[] merged = new object[items1.Length + items2.Length];
现在,您的循环需要完成一些工作:
for (int i = 0; i < mergedArray.Length; i++)
{
if (array is ValueType && array2 is ValueType)
{
if (array[i] > array2[i])
数组永远不是值类型。我认为您不了解值和引用之间的区别,而这对理解确实很重要,因此请对此进行一些研究。
此外,您还有一个计数器i
,用于对大合并数组进行计数,但是您可以将其用作小数组的索引。那是非常错误的。你知道为什么吗?
这样考虑:您将同时在两个数组中进行计数,以填充合并后的数组。这样就可以了:
int current1 = 0;
int current2 = 0;
while (current1 + current2 < merged.Length)
{
if (comparer(items1[current1], items2[current2]) < 0)
{
// items1[current1] is the smaller
merged[current1+current2] = items1[current1];
current1 += 1;
}
else
{
上面的代码中有一个错误; 提示:所有数组访问的索引必须是数组的>= 0
和< Length
。到目前为止,我编写的代码中是否有办法被违反?
答案 1 :(得分:-3)
public static object[] mergeTwoSorted<Tone, Ttwo>(Tone[] array, Ttwo[] array2)
where Tone : IComparable<Ttwo>
{
var mergedArray = new object[array.Length + array2.Length];
for (int i = 0; i < mergedArray.Length; i++)
{
if (array is ValueType && array2 is ValueType)
{
if (array[i].CompareTo( array2[i] )>0)
}
}
return mergedArray;
}
答案 2 :(得分:-7)
如果要对泛型使用特定的操作,则必须相应地使用where子句限制它们。与使用分形数字一样,您需要一个公分母。
类似于“ IMergable”界面,您必须自己编写。
public IMergeable[] mergeTwoSorted<Tone, Ttwo> (Tone[] array, Ttwo[] array2)
where Tone : IMergeable, Ttwo : IMergeable
{
IMergeable[] mergedArray = new IMergeable[array.Length + array2.Length];
for (int i = 0; i < mergedArray.Length; i++)
{
if (array is ValueType && array2 is ValueType)
{
if (array[i] > array2[i])
}
}
}
或者,您可以使用一种类型:
public Tone[] mergeTwoSorted<Tone> (Tone[] array, Tone[] array2)
{
IMergeable[] mergedArray = new IMergeable[array.Length + array2.Length];
for (int i = 0; i < mergedArray.Length; i++)
{
if (array is ValueType && array2 is ValueType)
{
if (array[i] > array2[i])
}
}
}