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

时间:2018-11-21 15:29:37

标签: 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])

        }
    }
}

关于如何解决此问题的任何想法?

3 个答案:

答案 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])

                }
            }
        }