Рассмотрим этот минимальный воспроизводимый пример (полный код в конце)
- Мы определяем объект IDataView из IEnumerable.
- Мы хотим поместить его обратно в другой IEnumerable< /code>, но он содержит другой объект (хотя и с теми же именами столбцов).
- Этот второй класс имеет 2 свойства, которые являются массивами. Если свойство имеет значение только «get», оно не будет обновляться/инициализироваться с помощью mlContext.Data.CreateEnumerable (они будут инициализированы значением 0 и никогда не будут обновляться). В противном случае оно будет обновлено/инициализировано с помощью mlContext.Data.CreateEnumerable.
Однако кажется, что mlContext.Data.CreateEnumerable хочет заменить этот массив другим. . Как ни странно, если это только get, я даже не получаю ошибки. Так что я немного в замешательстве.
Чтение полного MRE может дать более четкое представление о том, чего я не понимаю:
Код: Выделить всё
using Microsoft.ML;
using Microsoft.ML.Data;
public class Program
{
public static void Main()
{
var mlContext = new MLContext();
SampleInput a = new SampleInput() { Value1 = new float[] { 1.0f }, Value2 = new float[] { 1.0f } };
SampleInput b = new SampleInput() { Value1 = new float[] { 2.0f }, Value2 = new float[] { 2.0f } };
List inputData = [a, b];
// Convert input data to IDataView
IDataView inputView = mlContext.Data.LoadFromEnumerable(inputData);
// Use CreateEnumerable to convert back to a list of SampleOutput
var outputData = mlContext.Data.CreateEnumerable(inputView, reuseRowObject: false);
// Print the output
foreach (var output in outputData)
{
Console.WriteLine($"Field1: {string.Join(", ", output.Field1)}"); // 1 and 2, I'm happy about that
Console.WriteLine($"Field2: {string.Join(", ", output.Field2)}"); // Always 0?????????
// But didn't throw an error when it tried to initialize the array????
}
}
}
public class SampleInput
{
[ColumnName("Value1")]
[VectorType(1)]
public float[] Value1 { get; set; }
[ColumnName("Value2")]
[VectorType(1)]
public float[] Value2 { get; set; }
}
public class SampleOutput
{
[ColumnName("Value1")]
[VectorType(1)]
public float[] Field1 { get; init; } = new float[1];
[ColumnName("Value2")]
[VectorType(1)]
public float[] Field2 { get; } = new float[1];
}
Сам Rider говорит: «Авто-свойство можно сделать доступным только для получения», что (очевидно) не соответствует действительности, учитывая этот пример.
Вполне логично, что mlContext.Data.CreateEnumerable использует свойство init, но почему оно не выдает никаких ошибок, если я не разрешаю инициализацию?
Очевидно, что должно (это работает, это выдает ошибку, но Field2 не выдает ошибку, когда mlContext.Data.CreateEnumerable не удается его обновить).
Я пытался просмотреть исходный код, но запутался.
Подробнее здесь: https://stackoverflow.com/questions/789 ... t-property
Мобильная версия