c# - 为什么我的通用扩展方法说不能从 T 转换为 ..... 或 .. 到 T

标签 c# .net extension-methods

关于我的问题

https://stackoverflow.com/questions/10241345/any-percentage-function-in-net

https://stackoverflow.com/questions/9942202/percentage-of-each-element-in-linq

我想在 .Net 4.0 中创建一个通用扩展方法,它将生成列表项占列表总和的百分比。此列表将仅为数字类型。

我的代码是

public static T Percentage<T>(this T array) where T: ? // What should come in place of ? 
{
  double[] darray = (double[])T; // Error convert type 'T' to 'double[]'

  darray = darray.Select(x=> x * 100 / darray.Sum()).ToArray();

  return darray; // Error convert type 'double[]' to 'T'
}

我想这样调用它

double[] MD = {8.0,21.0,25.0,13.0,26.0,37.0,37.0,33.0,71.0,9.0};

MD = MD.Percentage().ToArray(); 

我做错了什么;

最佳答案

您不能通过“数字”值来约束类型。这在某种程度上是框架的限制。

最好的办法就是这样做:

public static IEnumerable<double> Percentage(this IEnumerable<int> values)
{
    var sum = values.Sum();
    return values.Select(v => (double)v / (double)sum).ToArray();
}

public static IEnumerable<double> Percentage(this IEnumerable<long> values)
{
    var sum = values.Sum();
    return values.Select(v => (double)v / (double)sum).ToArray();
}

public static IEnumerable<double> Percentage(this IEnumerable<double> values)
{
    var sum = values.Sum();
    return values.Select(v => v / sum).ToArray();
}

本质上,您需要为要支持的每种类型生成一个重载。

关于c# - 为什么我的通用扩展方法说不能从 T 转换为 ..... 或 .. 到 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10256969/

相关文章:

c# - 在 C# 中对 List<Tuple<int,int>> 进行二进制搜索

c# - 动态 C#.NET Web 服务

c# - 面板 2 的 splitcontainer splitterdistance

.net - 从 Windows Azure 上的 .NET 应用程序连接到 VPN?

c# - 使用扩展方法引发 C# 事件 - 这不好吗?

c# - 限制通用扩展方法扩展字符串

c# - 模型未实现 INotifyPropertyChanged

c# - 二元搜索和indexof 哪个更快?

c# - 根据下拉选择 MVC 显示值

java - Gamemaker Studio android java 扩展不执行 Intent