2017-02-22 29 views
0

У меня есть метод (AlphaCalcResult), который должен возвращать несколько значений. Каждый forloop имеет некоторую логику, которая присваивает значение полю List. Затем я хотел бы вернуть объект результата с двумя значениями, созданными из двух циклов, описанных ниже. Новое для разработки C# и проблемы с синтаксисом.C# возвращает несколько значений в объекте

Как я могу получить оператор возврата в моем коде ниже?

public AlphaCalcResult CalculateAlpha(AlphaCalcParam param) 
{ 
    AlphaCalcResult result = new AlphaCalcResult 
    { 
     portfolios = new List<Portfolio>() 
    }; 

    // Lists Portfolios & Settings 
    var portfolioListItem = param.portfolios.portfolioHoldings; 
    var scoreListItem = param.settings.grossAlphas; 

    // 1. CALCULATE FUND ALPHA 
    for (var i = 0; i<portfolioListItem.Count; i++) 
    { 
     portfolioListItem[i].fundRating = i; 

     for (var j = 0; j<scoreListItem.Count; j++) 
     { 
      scoreListItem[j].fundRating = j; 

      if(i == j) 
      { 
       portfolioListItem[i].fundAlpha = scoreListItem[j].grossAlpha - portfolioListItem[i].fundExpenseRatio; 
      } 
     } 
    } 

    //2. CALCULATE PORTFOLIO ALPHA 
    var portfolioAlphaResult = param.portfolios.portfolioAlpha; 
    for (var i =0; i<portfolioListItem.Count; i++) 
    { 
     portfolioAlphaResult = portfolioListItem[i].fundWeight * portfolioListItem[i].fundAlpha; 
    }; 

    // populate result 
    return result; 
    } 
+3

Вы никогда не заполняете результат, вы создаете пустой список, выполняете нагрузку, которая никогда не добавляется в этот список, и возвращая пустой список – bizzehdee

+0

, можете ли вы направить меня в правильном направлении, пожалуйста? –

+2

Я думал, что сделал .... Вы вычисляете 'portfolioAlphaResult', но никогда не добавляете его в' result.portfolios'. – bizzehdee

ответ

1

первое изменение public IEnumerable<Portfolio> portfolios { get; set; } к

public List<Portfolio> portfolios { get; set; } 

потому что IEnumerable используется для чтения списка и в своем коде добавить

//2. CALCULATE PORTFOLIO ALPHA 
     for (var i =0; i<portfolioListItem.Count; i++) 
      { 

     List<PortfolioHolding> list = new List<PortfolioHolding>(); 
     list=portfolioListItem; 
     Portfolio port = new Portfolio(); 
     port.portfolioIdentifier = "current"; 
     port.portfolioAlpha = portfolioListItem[i].fundWeight * portfolioListItem[i].fundAlpha; 
     port.portfolioHoldings = list; 
     result.portfolios.Add(port); 

     }; 
+0

Является ли это другим для цикла или существующего? –

+1

обновил мой ответ – Usman

1

Я не уверен, если это действительно то, что вы могли бы сделать в этом случае, но вы можете вернуть несколько значений с помощью .NET 4.0 + s тип кортежей.

Для примера:

public Tuple<string, int> GetValues() 
{ 
    return Tuple.Create("first",2); 
} 

// usage: 
var result = GetValues(); 
var theString = result.Item1; 
var theInt = result.Item2; 
1

Изменить эту часть:

//2. CALCULATE PORTFOLIO ALPHA 
var portfolioAlphaResult = param.portfolios.portfolioAlpha; 
for (var i =0; i<portfolioListItem.Count; i++) 
{ 
    portfolioAlphaResult = portfolioListItem[i].fundWeight * portfolioListItem[i].fundAlpha; 
    (result.portfolios as List<Portfolio>).Add(new Portfolio() { portfolioAlpha = portfolioAlphaResult }); 

}; 
+0

Пробовал, но получал ошибку IEnumerable не содержит определения для добавления и никакого метода расширения. Добавить принятие первого аргумента. –

+1

К сожалению, см. Мой обновленный ответ –

 Смежные вопросы

  • Нет связанных вопросов^_^