【问题标题】:Generic Function: Cast T[] to Complex[]通用函数:将 T[] 转换为 Complex[]
【发布时间】:2016-06-30 12:17:06
【问题描述】:

我需要一个适用于任何实值或复值数组的函数。

但是,对于函数本身,在Complex[]-Array 上工作非常方便。因此,我想将任何不是Complex[] 类型的数组(例如double[]byte[]int[]...)类型转换为Complex[]

我认为这对我自己来说可能是一个很好的练习来编写一个小的通用函数:

private static Complex[] convertArrayToComplex<T>(T[] inpArr)
{
    if (typeof(T) != typeof(Complex[]))
    {
        Complex[] inpArrC = new Complex[inpArr.Length];
        for (int k = 0; k < inpArr.Length; k++)
        {
            inpArrC[k] = new Complex((double)(object)inpArr[k], 0);
        }
        return inpArrC;
    } else
    {
        return inpArr; // Compiler-Error is here
    }
}

当然这不起作用:编译器错误告诉我,T[] 不能隐式转换为 Complex[]。我确实理解这一点,但我看不到以优雅的方式实现我的目标的方法。

约束:我知道inpArr 是一个数值数组。

【问题讨论】:

  • 你可以试试这个。 return (Complex[]) inpArr;
  • 谢谢。但我需要返回Complex[]。这会给我一个错误“T cannot be cast to Complex[]
  • 当您明确需要double 数组时,为什么还要使用T 数组?为什么方法没有定义为convertArrayToComplete(double[] inpArr)
  • 泛型方法应该对所有类型T 表现一致,因此您应该避免这种类型检查。在这种情况下,您的函数仅适用于 double[] 输入,因为 (double)(object)inpArr[k] 转换对于任何其他类型都将失败。
  • 您真的在寻找Convert.ToDouble(inpArr[k]) 吗?检查实际基础值类型并找出转换或提取双精度值的正确方法?

标签: c# arrays generics casting


【解决方案1】:

你可以知道类型是相等的,但你还是要说服编译器。另外,我会通过使用is 而不是类型检查来使代码更清晰:

private static Complex[] convertArrayToComplex<T>(T[] inpArr)
{
    if (inpArr is Complex[])
    {
        return (Complex[])(object)inpArr;
    }

    Complex[] inpArrC = new Complex[inpArr.Length];

    for (int k = 0; k < inpArr.Length; k++)
    {
        inpArrC[k] = new Complex(Convert.ToDouble(inpArr[k]), 0);
    }

    return inpArrC;
}

【讨论】:

  • 您可能应该将(double)(object)inpArr[k] 替换为Convert.ToDouble(inpArr[k]),这适用于许多其他数组类型(即int[]float[] 等)
  • 这是个好建议。虽然这是 OP 的解码代码,似乎已经可以工作,所以我不想过多地摆弄它。
  • 好建议,我会在五分钟内接受答案...很快:)
  • 第二部分换成return inpArr.Select(number =&gt; new Complex(Convert.ToDouble(number), 0)).ToArray();怎么样?
  • 不错的建议,如果有人使用 Linq。
猜你喜欢
  • 2014-03-23
  • 2019-07-18
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多