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