Как вернуть list из метода в c
Перейти к содержимому

Как вернуть list из метода в c

  • автор:

Возврат объекта List из метода

Как правильно возвращать объект List из метода? Если просто сделать List выходным параметром, не получится ли операция слишком тяжелой за счет копирования значений локальной переменной метода наружу?

Ответы (2 шт):

Если вы генерируете список внутри некоего метода, то best practices предлагают делать так:

Т.е. вы сначала не инициализируете ваш Dictionary нуллом или пустым словарем, т.е. избавляетесь от лишних проверок или переприсваивания.

А вот если вам нужно изменить уже имеющийся словаре someDict, как он указан в моём примере, то имеет смысл передавать его по ссылке в метод. Подробнее почитать можно тут: Передача аргумента по ссылке — ref

Лист хранит в себе ссылки на объекты, а не сами объекты. Поэтому каким бы большим у вас лист ни был, копирования локальных переменных «наружу», т.е. создание новых экземпляров-копий не произойдёт, и о производительности в данном случае беспокоиться не стоит.

Если всё же сомневаетесь, попробуйте инициализировать новый лист до вызова вашего метода и передавать его туда в качестве аргумента, а заполнять его уже в методе. При этом возвращать его не обязательно (метод может ничего не возвращать). По завершении метода у вас будет заполненный вашими данными лист.

Как вернуть список из метода в C#

Как вернуть список, содержащий результат LINQ to SQLquery? Я пытаюсь эту реализацию, но я получил эту ошибку.

Невозможно неявно преобразовать тип ‘System.Collections.Generic.List<AnonymousType#1>’ в ‘System.Collections.Generic.List<object>

Любая помощь будет оценена по достоинству.

Ответы (2)

Анонимные типы специально разработаны для использования исключительно в той области, в которой они определены. Если вы хотите вернуть результаты запроса из этого метода, вы должны создать новый именованный тип для представления результатов вашего запроса и выбрать экземпляры этого именованного типа, а не экземпляры анонимного типа.

Вы не можете вернуть список, где T является анонимным типом; вам нужно вернуть известный тип. Вы можете создать класс

Как можно безопасно вернуть List <T> из метода / свойства, объявленного как IEnumerable <T>?

Скажем, у меня есть свойство IEnumerable<int> , поддерживаемое полем List<int> , поэтому я могу изменить коллекцию из класса, но она публично отображается как доступная только для чтения.

Но с таким кодом вы можете легко вернуть объект, полученный из свойства, обратно в List<int> и изменить его:

Вопрос: , что лучше (лучше всего читать, проще всего писать, без потери производительности), чтобы избежать этого?

https://amdy.su/wp-admin/options-general.php?page=ad-inserter.php#tab-8

Я могу придумать по крайней мере 4 решения, но они не идеальны:

foreach и yield return :

действительно раздражает писать и читать.

+ вызовет исключение, когда кто-то попытается изменить возвращенную коллекцию
+ не создает копию всей коллекции.

+ Пользователь по-прежнему может изменять извлеченную коллекцию, но это не та же коллекция, которую мы модифицируем внутри класса, поэтому нам все равно.
создает копию всей коллекции, что может вызвать проблемы при большой коллекции.

Пользовательский класс оболочки.

+ не нужно клонировать коллекцию
, когда вы используете его как источник запросов LINQ, некоторые методы не будут использовать ICollection.Count , потому что вы его не открываете.

Есть ли лучший способ сделать это?

4 ответа

Вопрос: что лучше (лучше всего читать, проще всего писать, без потери производительности), чтобы избежать этого?

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

Если у вас есть проблема с безопасностью, я бы, скорее всего, использовал AsReadOnly . Это фактически самодокументируется и не имеет реальных недостатков (кроме небольшого выделения для обертки, поскольку нет копии данных, вы получаете значимые исключения при модификации и т.д.). Нет никакого реального недостатка в этом против создания собственной пользовательской оболочки, а пользовательская оболочка означает больше кода для тестирования и обслуживания.

В общем, я лично стараюсь избегать копирования без причины. Это исключало бы ToList() как вариант в целом. Использование итератора (ваш первый вариант) не так плохо, хотя на самом деле он не дает много преимуществ по сравнению с ReadOnlyCollection<T> .

В общем, я не в лагере. Если я дам вам IEnumerable, и вы отбросите его на что-то еще, то это тот, кто нарушил контракт, и это не моя вина, если что-то сломается. Если бы я оказался в положении, когда мне действительно нужно было защитить клиента от развращения моего состояния, я бы создал метод расширения, например:

Как вернуть список классов List в C#?

то есть id и name. Это нужно передавать как лист классов. Вот, что пока есть:

В Google никак не наткнусь на то, что требуется. Буду рад, если поищете за меня, но лучше, если поможете разобраться 🙂

  • Вопрос задан более трёх лет назад
  • 6041 просмотр
  • Facebook
  • Вконтакте
  • Twitter

Во-первых, разберитесь с терминологией. Судя по вашим репликам, вам надо возвращать не «список классов», а «список экземпляров класса MainLand».

Во-вторых, в чем вообще проблема? Нужный возвращаемый тип — это List<MainLand>, IEnumerable<MainLand> или MainLand[] — выбирайте любой. Или у вас проблема в том, чтобы его создать? Создаются они так:

Как альтернатива, список можно создать пустым и заполнить вызывая метод Add (конструктор списка, кстати, так «за кулисами» и делает).

Как альтернатива, можно создать список и вызвать у него метод ToArray()

Еще можно просто создать список или массив — они оба являются перечислениями.

Или у вас проблема в обращении к базе данных? Но тогда и надо задавать вопрос про базу данных, а не про список.

Ну и совет: найдите хоть какой-нибудь учебник по C#! Вы же задаете сейчас вопрос, который в любом учебнике описан. Неужели задать вопрос и три дня ждать ответа проще, чем за эти три дня найти ответ в учебнике?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *