Взгляните на GROUP_CONCAT
, если Ваша версия (4.1) MySQL поддерживает его. См. документация для получения дополнительной информации.
Это посмотрело бы что-то как:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';
Многие люди рекомендуют использовать дженерики, но похоже, что все они упускают суть. Часто речь идет не о падении производительности, связанном с упаковкой примитивных типов или приведениях, а о том, как заставить компилятор работать на вас.
Если у меня есть список строк, я хочу, чтобы компилятор доказал мне, что он всегда будет содержать список строк. Generics делает именно это - я указываю намерение, и компилятор доказывает это для меня.
В идеале, я бы предпочел систему с еще более богатым типом, в которой, например, можно сказать, что тип (даже если это был ссылочный тип) не может содержать нулевые значения, но, к сожалению, в настоящее время C # этого не предлагает.
Хотя бывают случаи, когда вы захотите использовать неуниверсальную коллекцию (например, кеширование), у вас почти всегда есть коллекции однородных объектов, а не гетерогенных объектов. Для однородной коллекции, даже если это набор вариантов базового типа или интерфейса, всегда лучше использовать дженерики. Это избавит вас от необходимости приводить результат к реальному типу, прежде чем вы сможете его использовать. Использование обобщений делает ваш код более эффективным и читабельным, потому что вы можете опустить код для выполнения приведения.
Используйте дженерики, когда хотите, чтобы ваша структура обрабатывала один тип. Например, если вам нужна коллекция строк, вам нужно создать экземпляр строго типизированного списка строк, например, так:
List<string> myStrings = new List<string>();
Если вы хотите, чтобы он обрабатывал несколько типов, вы можете обойтись без шаблонов, но вы понесете небольшой удар по производительности для операций упаковки / распаковки.
Все зависит от того, что вам нужно в долгосрочной перспективе.
В отличие от большинства ответов здесь, я не буду говорить «всегда используйте дженерики», потому что иногда вам нужно смешивать кошек с огурцами.
Во что бы то ни стало, старайтесь придерживаться дженериков по всем причинам, уже указанным в других ответах, например, если вам нужно объединить кошек и собак, создайте базовый класс млекопитающих и получите Stack<Mamal>
.
Но когда вам действительно нужно поддерживать все возможные типы, не бойтесь использовать объекты, они не кусаются, если вы не обращаетесь с ними плохо. :)
Иногда вы просто не можете использовать дженерики для этой цели. Например:
public ConstructorName(object defaultObject = null) {}
Если вы измените параметр по умолчанию на generics, это приведет к ошибке компиляции.