|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
Касательно этого моего поста. Нет, всё же, требование конструкторов без параметров в линке не даёт мне воспользоваться ReadOnlyCollection. Тогда остаётся узнать, что имеется ввиду под "the type of source ". И ещё, есть способ узнать, при вызове Count() начинается итерация по коллеции или всего лишь считывается готовое свойство? Скажем, под дебагом залезть во внутрь Enumerable>Count() можно, и посмотреть, выполнилось ли там условие (если следовать примеру skyANA) Код: c# 1. 2. 3. 4.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 11:01 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
user7320У меня сразу несколько вопросов возникло. 1. авторIf the type of source implements ICollection<T>, that implementation is used to obtain the count of elements. Otherwise, this method determines the count. А можете ещё пояснить эту фразу? Конкретно, какой вложенности "type of source" имеется ввиду? Например, я получаю результат запроса в виде IQuerayble, перевожу его в List через ToList(), потом отдаю это в свойство, которое показывает IEnumerable. Пользователь свойства считывает его и применяет метод Count(). В этом случае что имеется ввиду под "type of source": IEnumerable, List, IQuerayble или что-то ещё?List user73202. Я так понимаю, что даже если в свойство попадает полнофункциональный List, то показывая его как IEnumerable, я обрезаю ему функциональность до банального перебора коллекции и только?Да. Это называется инкапсуляция. user73203. Теперь учтём сразу 1 и 2. Пользователь моего свойства не знает, что служит источником для этого свойства. И если я показываю ему IEnumerable, то использовать расширение Enumerable.Count() он не имеет права, т. к. может загрузить как не знает, поддерживает ли источник этого свойства ICollection или нет. Так? Вот теперь тут всплывает наш старый спор - почему бы не заменить экспозицию свойства как IReadOnlyCollection на как IEnumerable, как предлагал skyANA. А потому что накладных расходов всё равно нет, если я в конце запроса вызываю ToList(), зато через IReadOnlyCollection я могу пользователю моего свойства явно сказать, что свойство можно не только перебирать, но и получить у него готовое число элементов Count, не боясь лишних переборов коллеции. Т. е. если я сам пишу свойства и сам их использую - то да, можно IEnumerable и потом для него вызывать расширитель Count(). Но в общем случае надо всегда показывать через тип возврата, что можно делать, а что нельзя. Правильно?Правильно - это изучать принципы ООП, а не выдумывать их. Восемь принципов программирования, которые могут облегчить вам жизнь ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 11:58 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
user7320Касательно этого моего поста. Нет, всё же, требование конструкторов без параметров в линке не даёт мне воспользоваться ReadOnlyCollection. Тогда остаётся узнать, что имеется ввиду под "the type of source ".Блеать! Ты каким местом документацию читаешь? Enumerable.Count<TSource> Method (IEnumerable<TSource>) Код: c# 1. 2. 3.
Parameters source - a sequence that contains elements to be counted. Под "the type of source " имеется ввиду конкретный тип параметра source ! user7320И ещё, есть способ ... под дебагом залезть во внутрь Enumerable>Count()? How to: Debug .NET Framework Source ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 12:16 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
авторБлеать! Ты каким местом документацию читаешь? Код: c# 1. 2. 3. 4.
Ну вот мы и видим, что IEnumerable<TSource> source не поддерживает Count(), а значит, расширитель будет использовать проход по коллекции. Но если вы скажете, что тут задействована ковариация, и компилятор может определить, что под IEnumerable<TSource> source сидит какой-нибудь ICollection, и тогда он воспользуется его свойством Count без прохода по коллеции... Или вы так не скажите? авторПод "the type of source" имеется ввиду конкретный тип параметра source! Т. е. таки ковариация? - Любой тип, унаследованный от IEnumerable? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 16:19 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
skyANAuser7320И ещё, есть способ ... под дебагом залезть во внутрь Enumerable>Count()? How to: Debug .NET Framework Source Проверил - код сразу возвращает Count, а не вычисляет его. Значит, с ковариацией моя догадка была верна. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 16:40 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
user7320skyANAпропущено... How to: Debug .NET Framework Source Проверил - код сразу возвращает Count, а не вычисляет его.Это ясно сразу после прочтения документации. Но тебе понадобилось потратить туеву хучу времени, чтобы убедиться. Молодец! user7320Значит, с ковариацией моя догадка была верна.Ты толком не понял, что такое ковариация. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 17:56 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
skyANAuser7320Значит, с ковариацией моя догадка была верна.Ты толком не понял, что такое ковариация. Почему? - Это когда можно передавать объект типа, более унаследованного, чем объявленный. У МС, правда, вводятся ещё всякие ограничения, когда это применяется для параметров или возвращаемых значений. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 19:58 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
user7320skyANAпропущено... Ты толком не понял, что такое ковариация. Почему? - Это когда можно передавать объект типа, более унаследованного, чем объявленный.Нет, это не правильное определение. Ты его сам придумал? А что такое полиморфизм в твоём понимании? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 20:03 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
skyANAuser7320пропущено... Почему? - Это когда можно передавать объект типа, более унаследованного, чем объявленный.Нет, это не правильное определение. Ты его сам придумал? А что такое полиморфизм в твоём понимании? Ладно, преположим, что я не знаю, что такое ковариация и прочие такие штуки. Но вопрос-то (первый абцаз в моём комментарии) остаётся! Т. е. расширитель будет использовать проход по коллеции. А он на деле не использует! Как же так? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 20:24 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
user7320, ты завязывай траву-то курить. Тебе уже и ссылку на документацию дали, и код метода расширения, и ты убедился в том, что он работает так, как написан. А всё равно не врубаешься. Высохли походу мозги-то ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 00:36 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
skyANAuser7320, ты завязывай траву-то курить. Тебе уже и ссылку на документацию дали, и код метода расширения, и ты убедился в том, что он работает так, как написан. А всё равно не врубаешься. Высохли походу мозги-то Ладно, будем отталкиваться от этого поста . Вы, конечно, прямо не говорите, но я так понимаю, что согласны, что компилятор знает, какой конкретный тип сидит под IEnumerable во время выполнения, реализует ли этот тип ICollection и в результате применяет или не применяет уже заполненное свойство Count при вызове расширяющего метода Count(). Но пользователь-то, который считывает моё свойство IEnumerable, не знает всего этого! Как же тут тогда быть? Это же, как её, инкабсумляция, мать её! Как: 1) дать ему возможность перебрать свойство this.Groups; 2) дать ему возможность считать (не вычислить перебором!) число элементов коллекции этого свойства; 3) не дать ему возможности добавлять и изменять элементы в коллеции явно (т. е. обойтись без всяких ICollection; если будет копировать коллецию в другую, где сможет менять всё, что захочет - его проблемы); 4) не показывать ему код модели (т. е. он не знает, что там сидит под IEnumerable или какое я свойство ему выставлю) - т. е. он не может рассчитывать на вызов метода (Count(), например), не зная, сколько это ему будет стоит; 5) чтобы свойство имело не конкретный тип, а абстрактный, потому что так говорят великие десять заповедей восемь принципов ООП; 6) чтобы у этого типа были конструкторы без параметров, чтобы можно было использовать инициализацию в LINQ? Вроде, ничего не забыл. У меня такое ощущение, что я пытаюсь донести все эти пункты, а мне говорят "ну вот же тебе IEnumerable - он удовлетворяет четырём твоим трбованиям", или "любые три из шести", или "5 из 36" - спортлото какое-то получается. На вскидку: IEnumerable не подходит по п.4; ICollection - п. 3; IReadOnlyCollection - п. 6, т. к. реализует этот тырфейс из подходящих мне коллеций только ReadOnlyCollection, у которой конструктор с параметром - т. е. в линке не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 06:14 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
user7320, ну у тебя походу два выхода: переписать код нормально, либо реализовать свой класс коллекции, блеать! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 08:28 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
Или добавить свойство: Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 09:20 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
Короче, если есть каунт, то ленивые загрузки уже не катят, а раз так, то гулять так гулять. Тем более, что там не более 20 записей в одной таблице и на каждую из них по 0-5 записей через связь. Чёжь вы сразу не сказали, что надо делать так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
Вся суть в ToList после "from wg in db.WeedGroups select wg". Вот теперь эта штука удовлетворяет всем 6 требованиям. В смысле, что шестое ликвидировалось путём загрузки в память нужной коллекции. А все эти ленивые загрузки при таких смехотворных данных, как у меня - это эти, как их... а, преждевременные оптимизации, во! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 12:41 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
Вот когда надо будет действительно чего-то там лениво делать или бояться, что слишком много загрузит из БД и сервер нагнёт, тогда да, можно будет отдельное свойство для Count сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 12:43 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
Чтобы не было расходов, можно фильтр поставить в "from wg in db.WeedGroups select wg", но у меня просто задача была как раз вытащить всё, без фильтра. Да, и у меня фигня написана была раньше в этом месте Biogroups = db.Biogroups .Where... А сейчас сделал так Biogroups = selectedWG.Biogroups .Where... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 12:47 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
user7320, а че амнет галочки как загрузить?(по требованию или всегда) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 12:59 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
ТС тебя кто научил в конструкторе такое вытворять? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 13:01 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
handmadeFromRuТС тебя кто научил в конструкторе такое вытворять? Да вы к словам не привязывайтесь - мы уже это обсудили. Это такой тестовый код, чтобы репозиторий не писать. Главное то, что я отметил как "СУТЬ". ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 13:25 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
user7320Короче, если есть каунт, то ленивые загрузки уже не катят, а раз так, то гулять так гулять. Тем более, что там не более 20 записей в одной таблице и на каждую из них по 0-5 записей через связь. Чёжь вы сразу не сказали, что надо делать такТебе сразу намекнули, что ты пишешь плохой код. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 14:46 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
skyANAuser7320Короче, если есть каунт, то ленивые загрузки уже не катят, а раз так, то гулять так гулять. Тем более, что там не более 20 записей в одной таблице и на каждую из них по 0-5 записей через связь. Чёжь вы сразу не сказали, что надо делать такТебе сразу намекнули, что ты пишешь плохой код. А новый лучше? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 17:05 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
user7320skyANAпропущено... Тебе сразу намекнули, что ты пишешь плохой код. А новый лучше?Неа. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 17:22 |
|
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
|
|||
---|---|---|---|
#18+
skyANAuser7320пропущено... А новый лучше?Неа. А по-моему, лучше. Ведь я реализовал всё, что хотел. А репозиторий будет в следующей серии... или в следующем сезоне. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2013, 19:48 |
|
|
start [/forum/topic.php?fid=17&gotonew=1&tid=1349912]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
129ms |
get topic data: |
10ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 270ms |
total: | 519ms |
0 / 0 |