如何在泛型函数中使用if/else?C#

-2 c#

首先,我想说的是关于编码的新手,所以如果代码看起来很糟糕,不要杀了我.

好吧,问题是我试图制作一个通用函数,其目的是获取两个已排序的数组并将它们合并为一个新的排序数组.我面临的问题是尝试在函数中使用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])

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有关如何解决这个问题的任何想法?

Eri*_*ert 6

首先,我想说的是关于编码的新手,所以如果代码看起来很糟糕,不要杀了我.

到目前为止它看起来很合理.看起来你要做的是采用两种不同类型的两个排序数组,但两种类型之间存在排序关系.然后,您将两个数组合并为一个对象数组,这样两个数组中的对象仍然处于相同的顺序,但它们相互交错以匹配类型间排序关系,是吗?

这是不寻常的事情,但它是可能的.

如果这不是您正在做的事情,那么您需要停止并重新设计代码.特别是,如果你打算采用两个相同类型的数组,那么你必须有一个类型参数,而不是两个,你必须创建一个数组T作为输出,而不是object.

问题是在C#中通常无法表达"我在这两种类型之间存在排序关系".你必须提供一个能够做到这一点的功能.传统上我们提供一个函数,它接受两种类型并返回一个整数:-1如果第一个是较小的则为1,如果第二个较小则为1,如果它们相等则为0.

如果我们有,那么您的方法变为:

public static object[] MergeTwoSorted<TOne, TTwo> (
  TOne[] items1, 
  TTwo[] items2,
  Func<TOne, TTwo, int> comparer) 
{
Run Code Online (Sandbox Code Playgroud)

请注意,我们在此处使用标准C#约定.方法以大写,类型参数等开头TSomething.A Func<A, B, C>是一个带a A,a B和返回a 的函数C.不操纵其类实例的方法是static.

请注意,不需要在事物的名称中重新声明其类型.说出逻辑上的东西,而不是它的存储方式:

    object[] merged = new object[items1.Length + items2.Length];
Run Code Online (Sandbox Code Playgroud)

现在你的循环需要一些工作:

    for (int i = 0; i < mergedArray.Length; i++)
    {
        if (array is ValueType && array2 is ValueType)
        {
            if (array[i] > array2[i])
Run Code Online (Sandbox Code Playgroud)

数组永远不是值类型.我认为您不理解值和参考之间的区别,这对理解非常重要,因此对此进行一些研究.

此外,您有一个计数器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
  {
Run Code Online (Sandbox Code Playgroud)

上面的代码中有一个错误; 你能找到吗?提示:所有数组访问的索引必须是>= 0和数组的索引< Length.到目前为止,我写的代码中有没有一种方法会被违反?

  • 你能修复这个bug并完成它吗?
  • 你现在可以创建一个调用站点,它接受一个字符串数组,一个数字数组,以及字符串和数字之间的排序关系,并合并数组吗?