Преобразуйте все значения T с помощью LINQ и назначьте их массиву другого типа - PullRequest
0 голосов
/ 28 мая 2020

Я sh, чтобы иметь возможность изменить значение некоторого параметра generi c типа 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 [], et c.
Обработка массивов также сложна.

Я также пробовал использовать обычный для l oop, как показано ниже:

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.

EDIT

Обратите внимание, что ModifyValue () - это просто фиктивный пример. "param" ДОЛЖЕН быть generi c!

EDIT 2

Возможно, я мог бы что-то сделать вокруг этих строк (хотя не знаю, как это сделать):

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

    return ret;
}

1 Ответ

1 голос
/ 28 мая 2020

Мне не кажется, что это действительно скомпилируется.

Я думаю, что у вас сначала отсутствуют две важные вещи, как Павел предположил в своем комментарии, вы возвращаете T из ConvertParam, и он принимает и аргумент T , но вы не объявили T.

Во-вторых, вы используете LINQ против общего типа c, но нет ничего, что позволяло бы компилятору узнать, что параметр доступен для запроса 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;
}

EDIT: как говорили другие, я не уверен, что ваш код имеет смысл с точки зрения варианта использования.

...