Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将变量强制转换为同一类型的动态变量?_C#_.net_Variables_Dynamic_Casting - Fatal编程技术网

C# 如何将变量强制转换为同一类型的动态变量?

C# 如何将变量强制转换为同一类型的动态变量?,c#,.net,variables,dynamic,casting,C#,.net,Variables,Dynamic,Casting,我目前正在研究一种放大方法,该方法将PCM样本作为I集合(调用者将只传递一个集合:sbyte、short或int)。我创建的放大算法工作得很好;只是我不知道如何将新放大的样本转换回原始类型,因为放大逻辑将样本输出为列表 我知道我可以添加一些switch语句来将示例转换回其原始类型,但这似乎是一个相当原始的解决方案,有没有更好的方法来实现这一点 我如何调用该方法(samples是一个Listcontiningints,file是我为读取wav文件而创建的类) 我的方法, static privat

我目前正在研究一种放大方法,该方法将PCM样本作为
I集合
(调用者将只传递一个集合:
sbyte
short
int
)。我创建的放大算法工作得很好;只是我不知道如何将新放大的样本转换回原始类型,因为放大逻辑将样本输出为
列表

我知道我可以添加一些
switch
语句来将示例转换回其原始类型,但这似乎是一个相当原始的解决方案,有没有更好的方法来实现这一点

我如何调用该方法(
samples
是一个
List
contining
int
s,
file
是我为读取wav文件而创建的类)

我的方法,

static private List<dynamic> AmplifyPCM(ICollection<dynamic> samples, ushort bitDepth, float volumePercent)
{
    var highestSample = 0;
    var temp = new List<dynamic>();

    foreach (var sample in samples)
    {
        if (sample < 0)
        {
            temp.Add(-sample);
        }
        else
        {
            temp.Add(sample);
        }
    }

    foreach (var sample in temp)
    {
        if (sample > highestSample)
        {
            highestSample = sample;
        }
    }

    temp = null;

    var ratio = (volumePercent * (Math.Pow(2, bitDepth) / 2)) / highestSample; 
    var newSamples = new List<dynamic>();

    foreach (var sample in samples)
    {
        newSamples.Add(sample * ratio); // ratio is of type double, therefore implicit conversion from whatever sample's type is to a double.
    }

    // switch statement would go here if there's no better way.

    return newSamples;
}
静态私有列表(ICollection样本、ushort位深度、float volumePercent)
{
var highestSample=0;
var temp=新列表();
foreach(样本中的var样本)
{
如果(样本<0)
{
添加温度(-样品);
}
其他的
{
温度添加(样品);
}
}
foreach(温度中的var样本)
{
如果(样本>最高样本)
{
最高样本=样本;
}
}
温度=零;
var比率=(容积百分比*(数学功率(2,比特深度)/2))/最高样本;
var newSamples=新列表();
foreach(样本中的var样本)
{
newSamples.Add(sample*ratio);//ratio是double类型,因此隐式地将sample的类型转换为double。
}
//如果没有更好的方法,switch语句将转到这里。
返回新闻样本;
}

好吧,您只需将其设置为泛型,即可给出返回类型。但是C#中不支持带有泛型的运算符。您可以尝试将它们转换为动态

static private List<T> AmplifyPCM<T>(ICollection<T> samples, ushort bitDepth, float volumePercent)
{
    var highestSample = 0;
    var temp = new List<T>();

    foreach (var sample in samples)
    {
        if ((dynamic)sample < 0)
        {
            temp.Add(-(dynamic)sample);
        }
        else
        {
            temp.Add(sample);
        }
    }

    foreach (var sample in temp)
    {
        if ((dynamic)sample > highestSample)
        {
            highestSample = (dynamic)sample;
        }
    }

    temp = null;

    var ratio = (volumePercent * (Math.Pow(2, bitDepth) / 2)) / highestSample;
    var newSamples = new List<T>();

    foreach (var sample in samples)
    {
        newSamples.Add((dynamic)(T)sample * ratio);
    }

    return newSamples;
}
静态私有列表(ICollection样本、ushort位深度、float volumePercent)
{
var highestSample=0;
var temp=新列表();
foreach(样本中的var样本)
{
如果((动态)样本<0)
{
温度添加(-(动态)样品);
}
其他的
{
温度添加(样品);
}
}
foreach(温度中的var样本)
{
如果((动态)样本>最高样本)
{
最高样本=(动态)样本;
}
}
温度=零;
var比率=(容积百分比*(数学功率(2,比特深度)/2))/最高样本;
var newSamples=新列表();
foreach(样本中的var样本)
{
添加((动态)(T)样本*比率);
}
返回新闻样本;
}

你可以把这个方法变成泛型的,对你来说行吗?@ToughCoder我没有想过使用泛型,是的,我想这会解决问题。谢谢你想写一个答案,这样我就可以相信你了吗?很乐意帮忙。谢谢你的学分。你不能在
t
上做算术。像
sample<0
-sample
这样的东西不会编译。也没有办法说,例如,
where T:number
允许这样的事情,这可能就是为什么该方法从“动态开始”。@TimS。我没有检查Visual Studio上的代码。让我检查一下,我会更新我的答案。啊,是的,我刚刚检查过,我认为我不使用泛型是有原因的,谢谢你的建议。有趣的是,我没有考虑将两者结合起来。@Sam你可以创建IArithmetic接口来转换int,double类型,但这太麻烦了。检查此Jon Skeet链接中的通用运算符:
static private List<T> AmplifyPCM<T>(ICollection<T> samples, ushort bitDepth, float volumePercent)
{
    var highestSample = 0;
    var temp = new List<T>();

    foreach (var sample in samples)
    {
        if ((dynamic)sample < 0)
        {
            temp.Add(-(dynamic)sample);
        }
        else
        {
            temp.Add(sample);
        }
    }

    foreach (var sample in temp)
    {
        if ((dynamic)sample > highestSample)
        {
            highestSample = (dynamic)sample;
        }
    }

    temp = null;

    var ratio = (volumePercent * (Math.Pow(2, bitDepth) / 2)) / highestSample;
    var newSamples = new List<T>();

    foreach (var sample in samples)
    {
        newSamples.Add((dynamic)(T)sample * ratio);
    }

    return newSamples;
}