Список в IReadOnlyList <(десятичный, десятичный, десятичный)> - PullRequest
0 голосов
/ 16 марта 2020

У меня есть функция, принимающая эти аргументы:

public decimal[] Calculate(IReadOnlyList<(decimal High, decimal Low, decimal Close)> candles, int period)

, но я не помню, как ее назвать

List<BinanceKline> list = ...
Calculate(list.Select(e => new { e.High, e.Low, e.Close }), 20);

Она возвращает ошибку, которая очевидна.

ошибка CS1503: аргумент 1: невозможно преобразовать из 'System.Collections.Generi c .IEnumerable < > 'to' System.Collections.Generi c .IReadOnlyList <(десятичный максимум, десятичный минимум, десятичное закрытие)> '

Ответы [ 2 ]

4 голосов
/ 16 марта 2020

List<T> реализует IReadOnlyList<T>, поэтому вы можете сделать это:

var list = list
    .Select(e => (e.High, e.Low, e.Close))
    .ToList();

Calculate(list, 20);

Обратите внимание, что вам также нужно выбрать кортеж, а не анонимный объект.

2 голосов
/ 16 марта 2020

Ну, для

public decimal[] Calculate(
  IReadOnlyList<(decimal High, decimal Low, decimal Close)> candles, 
  int period) {...}

мы должны предоставить [IReadOnly]List и int (примечание .ToList()):

Calculate(
  list.Select(e => (e.High, e.Low, e.Close)).ToList(), 
  20);

, когда list.Select равно не достаточно : это просто IEnumerable<T>

Редактировать: Возможно, вы захотите * перепроектировать Calculate метод в

public decimal[] Calculate<T> (
  IEnumerable<T> data, 
  int period,
  Func<T, decimal> high,
  Func<T, decimal> low,
  Func<T, decimal> close) {

  //TODO: validation here 

  List<(decimal High, decimal Low, decimal Close)> candles = data
    .Select(item => (high(item), low(item), close(item)));

  //TODO: logic from former Calculate here
}

И затем вызвать его как

Calculate(
  list, 
  20, 
  item => item.High, 
  item => item.Low,  
  item => item.Close);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...