Nano Hash - криптовалюты, майнинг, программирование

C# Динамический выбор Список строк

Я пытаюсь получить List строк из моего списка динамических объектов, и он продолжает говорить, что:

Ошибка 1 Не удается неявно преобразовать тип «System.Collections.Generic.List<dynamic>» в «System.Collections.Generic.List<string>»

Я выбираю свойство и использую для него .ToString():

var objects = new List<dynamic>();
//filling objects here

List<string> things = objects.Select(x => x.nameref.ToString()).ToList();

Так разве это не действительный список строк? Почему компилятор предполагает, что этот список имеет тип dynamic?

Я также пытался преобразовать ответ из this, но он продолжает выдавать мне ту же ошибку.

Кто знает как сделать List<string>?

РЕДАКТИРОВАТЬ:

Почему это не работает? Потому что вы можете создать беспорядок следующим образом:

public class Test
{
    public int ToString()
    {
        return 0;
    }
}

и компилятор не будет знать, возвращает ли ToString string или int.

09.12.2015

Ответы:


1

Хотя ответ Роба работает нормально, позвольте мне предложить альтернативу: приведите nameref к правильному типу (замените (object) более конкретным приведением, если вам известен тип nameref):

List<string> things = objects.Select(x => ((object)x.nameref).ToString()).ToList();

Преимущество этого решения в том, что ToString разрешается статически. Таким образом, вызов метода

  • гарантированно вернет string, так как компилятор знает, что вы вызываете Object.ToString() (или его переопределенный вариант) и

  • быстрее и чище. Это решение удерживает динамическое разрешение на необходимом абсолютном минимуме (т. е. разрешение x.nameref). Опечатки в вызове ToString обнаруживаются компилятором.

(Конечно, если тип nameref является строкой, вы можете просто отказаться от вызова ToString(), что сделает ваш код еще чище и короче.)

09.12.2015

2

Вам нужно разыграть предметы, например:

List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>().ToList();

Причина, по которой он не распознает, что ToString() возвращает строку, заключается в том, что он вызывается для объекта dynamic, а привязка метода выполняется во время выполнения, а не во время компиляции.

09.12.2015

3

Вы можете попробовать использовать Cast, например:

List<string> things = objects.Select(x => x.nameref).Cast<string>().ToList();

Вы также можете попробовать выполнить кастинг самого Select:

List<string> things = objects.Select(x => x.nameref as string).ToList();
09.12.2015

4

Насколько я понимаю, преобразование в желаемое List<string> можно сделать следующим образом.

var objects = new List<dynamic>();

// filling objects here

List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>.ToList();
09.12.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..