У меня есть несколько методов, которые возвращают разные общие списки.
Существует ли в .net какой-либо статический метод класса или любой другой способ преобразования любого списка в таблицу данных? Единственное, что я могу себе представить, это использовать Reflection для этого.
Если у меня есть это:
List<Whatever> whatever = new List<Whatever>();
(Следующий код, конечно, не работает, но я хотел бы иметь возможность:
DataTable dt = (DataTable) whatever;
Ответы:
Вот хорошее обновление 2013 года с использованием FastMember от NuGet:
При этом используется API метапрограммирования FastMember для максимальной производительности. Если вы хотите ограничить его определенными участниками (или навязать порядок), то вы можете сделать это тоже:
Dis / claimer редактора : FastMember - это проект Марка Гравелла. Его золото и полные мухи!
Да, это в значительной степени полная противоположность этому ; отражения будет достаточно - или, если вам нужно быстрее,
HyperDescriptor
в 2.0, или, может быть,Expression
в 3.5. На самом деле,HyperDescriptor
должно быть более чем адекватным.Например:
Теперь с помощью одной строки вы можете сделать это во много раз быстрее, чем отражение (включив
HyperDescriptor
тип объектаT
).редактировать повторный запрос производительности; Вот тестовая установка с результатами:
Я подозреваю, что узкое место перешло от доступа пользователей к
DataTable
производительности ... Я сомневаюсь, что вы значительно улучшите это ...код:
источник
Мне пришлось изменить пример кода Марка Гравелла, чтобы обрабатывать обнуляемые типы и значения NULL. Я включил рабочую версию ниже. Спасибо Марк.
источник
public static DataTable ToDataTable<TKey, T>(this IEnumerable<IGrouping<TKey, T>> data)
Затем добавьте дополнительный столбец перед циклом foreach:table.Columns.Add("Key", Nullable.GetUnderlyingType(typeof(TKey)) ?? typeof(TKey));
А затем добавьте цикл вокруг цикла данных, в котором вы итерируете группы: foreach (IGrouping <TKey, T> группа в данных) {foreach (элемент T в group.Items) {Подробную информацию см. В этом GIST: gist.github.com/rickdailey/8679306ToDataTable
методе есть одна хитрая ошибка . ЕслиT
реализует интерфейс,typeof(T)
может вернуть тип интерфейса, а не фактический класс объекта, в результате чего пустойDataTable
. Замена егоdata.First().GetType()
должна исправить это.Небольшое изменение в ответе Марка, чтобы он работал с типами значений, такими как
List<string>
таблица данных:источник
Это простая смесь решений. Это работает с Nullable типами.
источник
Эту ссылку на MSDN стоит посетить: Как: реализовать CopyToDataTable <T>, где универсальный тип T не является строкой данных
Это добавляет метод расширения, который позволяет вам сделать это:
источник
Другой подход заключается в следующем:
источник
источник
Ответ Марка Гравелла, но в VB.NET
источник
попробуй это
источник
источник
Я сам написал небольшую библиотеку для выполнения этой задачи. Он использует отражение только в первый раз, когда тип объекта должен быть переведен в таблицу данных. Он испускает метод, который выполняет всю работу по переводу типа объекта.
Это пылает быстро. Вы можете найти его здесь: ModelShredder на GoogleCode
источник
Мне также пришлось придумать альтернативное решение, так как ни один из перечисленных здесь вариантов не работал в моем случае. Я использовал IEnumerable, который возвращал IEnumerable, и свойства не могли быть перечислены. Это сделало трюк:
источник
источник
Я понимаю, что это было закрыто некоторое время; Тем не менее, у меня было решение этой конкретной проблемы, но мне потребовался небольшой поворот: столбцы и таблица данных должны быть предварительно определены / уже созданы. Затем мне нужно было просто вставить типы в таблицу данных.
Итак, вот пример того, что я сделал:
источник
Ответ 2019, если вы используете .NET Core - используйте библиотеку Nuget ToDataTable . Преимущества:
Отказ от ответственности - я автор ToDataTable
Производительность - я включил некоторые тесты Benchmark .Net и включил их в репозиторий ToDataTable . Результаты были следующими:
Создание 100 000 строк данных :
Метод FastMember, предложенный в ответе Марка, показался хуже, чем ответ Мэри, в котором использовалось отражение, но я применил другой метод, используя FastMember,
TypeAccessor
и он показал себя намного лучше. Тем не менее пакет ToDataTable превзошел все ожидания .источник
Если вы используете VB.NET, тогда этот класс выполняет свою работу.
источник
если у вас есть свойства в вашем классе, эта строка кода в порядке!
но если у вас есть все открытые поля, используйте это:
исходный ответ сверху, я только что отредактировал, чтобы использовать поля вместо свойств
и использовать это сделать это
источник
Чтобы преобразовать общий список в таблицу данных, вы можете использовать DataTableGenerator
Эта библиотека позволяет вам преобразовывать ваш список в таблицу данных с такими функциями, как
источник
источник
Преобразовать общий список в DataTable
используя Newtonsoft.Json;
источник
Это простое консольное приложение для преобразования списка в Datatable.
источник
С этой точки зрения вы не найдете ничего другого.
источник
источник
Я думаю, что это более удобно и легко в использовании.
источник
Список / данные = новый список (); var dataDT = Newtonsoft.Json.JsonConvert.DeserializeObject (Newtonsoft.Json.JsonConvert.SerializeObject (data));
источник
Самый простой ответ может быть таким:
[ https://stackoverflow.com/a/60776314/10235747][1]
источник
Если вы хотите использовать отражение и установить порядок столбцов / включить только некоторые столбцы / исключить некоторые столбцы, попробуйте это:
источник