MlContext.Data.CreateEnumerable использует свойство init?C#

Место общения программистов C#
Ответить
Anonymous
 MlContext.Data.CreateEnumerable использует свойство init?

Сообщение Anonymous »

Примечание. Я новичок в C#, поэтому, возможно, я что-то неправильно понял об инициализаторах объектов.
Рассмотрим этот минимальный воспроизводимый пример (полный код в конце)
  • Мы определяем объект IDataView из IEnumerable.
  • Мы хотим поместить его обратно в другой IEnumerable< /code>, но он содержит другой объект (хотя и с теми же именами столбцов).
  • Этот второй класс имеет 2 свойства, которые являются массивами. Если свойство имеет значение только «get», оно не будет обновляться/инициализироваться с помощью mlContext.Data.CreateEnumerable (они будут инициализированы значением 0 и никогда не будут обновляться). В противном случае оно будет обновлено/инициализировано с помощью mlContext.Data.CreateEnumerable.
Я думал, что, поскольку свойство представляет собой массив, оно не не имеет значения, что это get только потому, что я могу получить его (получить ссылку на этот объект), а затем свободно изменять его элементы.
Однако кажется, что 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»