Использование списка в C # CLR - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь собрать входящие значения в список и выполнить некоторые действия против него. Код - это всего лишь пример для подведения итогов, но в конечном итоге я хочу манипулировать списком, чтобы получить практические навыки в изучении C # и CLR. Я разместил код ниже.

  • Init -> инициализировать значения
  • Accumulate забирает входящие данные
  • Слияние собирается добавить это значение в список
  • Терминатор должен суммировать значения
using System.Collections.Generic;
using System.Linq;
using System.Data.SqlTypes;
/// <summary>
/// Calculates the geometric mean of numerical values
/// </summary>
[System.Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Microsoft.SqlServer.Server.Format.Native, 
    IsInvariantToDuplicates = false, // receiving the same value again changes the result
    IsInvariantToNulls = false,      // receiving a NULL value changes the result
    IsInvariantToOrder = true,       // the order of the values doesn't affect the result
    IsNullIfEmpty = true,            // if no values are given the result is null
    Name = "abc"           // name of the aggregate
    )]
public struct Abc {

    public List<double> Cashflows { get; set; }

    /// <summary>
    /// Used to inform if the accumulation has received values
    /// </summary>
    public bool HasValue { get; private set; }

    /// <summary>
    /// Initializes a new Product for a group
    /// </summary>
    public void Init()
    {
        this.Cashflows = new List<double>();
        this.HasValue = false;
    }

    /// <summary>
    /// Calculates the product of the previous values and the value received
    /// </summary>
    /// <param name="number">Value to include</param>
    public void Accumulate(SqlDouble number)
    {
        if (!this.HasValue)
        {
            // if this is the first value received
            this.Cashflows.Add((double)number);
        }
        this.HasValue = true;
    }

    /// <summary>
    /// Merges this group to another group instatiated for the calculation
    /// </summary>
    /// <param name="group"></param>
    public void Merge(Abc group)
    {
        // Count the product only if the other group has values
        if (group.HasValue)
        {
            group.Cashflows.AddRange(Cashflows);
        }
    }

    /// <summary>
    /// Ends the calculation and returns the result
    /// </summary>
    /// <returns></returns>
    public SqlDouble Terminate()
    {
        return Cashflows.Sum();
    }
}

Ошибка:

Тип "CustomAggregates.XIRR" помечен для собственной сериализации, но поле "k__BackingField "типа" CustomAggregates.abc "имеет тип" CustomAggregates.abc ", который не является blittable, или тип" CustomAggregates.abc "имеет рекурсивное определение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...