【问题标题】:Convert all T values using LINQ and assign them to an array of different type使用 LINQ 转换所有 T 值并将它们分配给不同类型的数组
【发布时间】:2020-05-28 08:14:16
【问题描述】:

我希望能够修改泛型类型 T 的一些参数值,并且我正在尝试使用 LINQ 执行此操作,但我无法弄清楚。
这是我所拥有的:

public static T ConvertParam(T param)
{    
    T val = param.Select(i => { i = (T)ModifyValue(Convert.ToDouble(i)); });

    return val;
}

public static UInt64 ModifyValue(double value)
{
    UInt64 result = (UInt64)(value) * 3 + 1;

    return result;
}

在这种情况下,问题在于“ModifyValue()”返回的值需要转换为 T 参数包含的任何值,但我不知道该怎么做。 T 可以是 int、uint、int[]、uint[] 等
处理数组也很棘手。

我也尝试过正常的 for 循环,如下所示:

public static T ConvertParam(T param)
{
    List<UInt64> output = new List<UInt64>();

    foreach (var v in param)
    {
        output.Add(ModifyValue(Convert.ToDouble(v));
    }

    return output.ToArray();
}

这里的问题再次是返回的值可能是也可能不是数组。它应该只返回 T 参数的修改版本。

编辑

请注意,ModifyValue() 只是一个虚拟示例。 “param”必须是通用的!

编辑 2

也许我可以围绕这些行做点什么(虽然不知道怎么做):

public static T ConvertParam(T param)
{
    T ret = param.ToList().ConvertAll(i => i = new T() { ModifyValue(Convert.ToDouble(i)) });

    return ret;
}

【问题讨论】:

  • ConvertParam 应该有泛型类型参数T,否则ist 声明无效
  • 那么根据ModifyValue 所做的事情,您的value 是否总是double
  • 你打算怎么打电话给ConvertParam?为什么你认为它应该是通用的?
  • 你为什么要将输入转换为 double 只将其转换为 UInt64
  • @stackMeUp 如果你的值总是双倍的,你为什么需要泛型?

标签: c# linq generics casting


【解决方案1】:

在我看来,它实际上不会编译。

我认为您首先缺少两件重要的事情,正如 Pavel 在他的评论中建议的那样,您正在从 ConvertParam 返回 T 并且它需要 T 的参数,但您还没有声明 T。

其次,您使用的是针对泛型类型的 LINQ,但没有任何东西可以让编译器知道参数可以被 LINQ 查询。我认为您需要将代码更改为这样的内容


public static IEnumerable<T> ConvertParam<T>(IEnumerable<T> param)
{
    // This seems redundant
    // List<UInt64> output = new List<UInt64>(); 

    var val = param.Select(i => (T)ModifyValue(Convert.ToDouble(i)));

    return val;
}

public static UInt64 ModifyValue(double value)
{
    UInt64 result = (UInt64)(value) * 3 + 1;

    return result;
}

编辑:正如其他人所说,从用例的角度来看,我不确定您的代码是否有意义。

【讨论】:

  • 我正要写的差不多。 ;)
  • 谢谢,这也行。也许我对“选择”的使用不正确?
  • 刚刚注意到您的 Select 确实不正确,您正在为 i 分配新内容但没有返回它。已更新答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
相关资源
最近更新 更多