Я пытаюсь собрать входящие значения в список и выполнить некоторые действия против него. Код - это всего лишь пример для подведения итогов, но в конечном итоге я хочу манипулировать списком, чтобы получить практические навыки в изучении 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 "имеет рекурсивное определение.