[OOP] Defining Classes Part Two - Задача 5, 6, 7


7
5.Write a generic class GenericList<T> that keeps a list of elements of some parametric type T. Keep the elements of the list in an array with fixed capacity which is given as parameter in the class constructor. Implement methods for adding element, accessing element by index, removing element by index, inserting element at given position, clearing the list, finding element by its value and ToString(). Check all input parameters to avoid accessing elements at invalid positions.
 
6.Implement auto-grow functionality: when the internal array is full, create a new array of double size and move all elements to it.
 
7.Create generic methods Min<T>() and Max<T>() for finding the minimal and maximal element in the  GenericList<T>. You may need to add a generic constraints for the type T.
 
Решение+patch1: http://pastebin.com/D9yCXqfC
В count съхранявам кой по ред елемент записвам в масива.
 
В метода Delete(T point), не можах да измисля как да взема индекса на елемента, който се подава testList[1] с идекс, и затова използвам Array.IndexOf което не е много правилно, защото ако имам еднакви елементи ...
 
В метода InsertElement(int position, T element) ако масива ми е пълен ще загубя последния елемент.
 
С метода StretchCapacity() удвоявам дължината на масива.
 
За седма задача добавям интерфейса IComparable
 
public class GenericList<T>
    where T : IComparable
 
 



Отговори



0

Отначало когато пишех класа GenericList, и Main метода ми беше в него ми излизаше грешка от рода на : " Класа does not contain a static 'Main' method suitable for an entry point" , така и не разбрах какво я предизвика. Изместих Main метода в отделен клас и запали. Писах малко unit tests, тъй като за последно писах такива от главата за методи.  А това е решението ми. https://github.com/dbrezoev/SVN/tree/master/OOP/DefiningClassesPart2/GenericList


от d.brezoev (212 точки)


0
Мисля, че малко трябва да подредиш member-ите на класа. По конвенция трябва да бъдат подредени така: fields, constructors, properties, indexers, public methods, private methods. Най-добре си свали StyleCop, доста е удобно.
Методът GetElement на практика май дублира функционалността на индексатора.
В IsIndexValid(int index) мисля, че проверяваш с дължината на array. Май трябва да е this.usedSpace. Защото нали се преструваме, че елементите след usedSpace не съществуват? :) На практика usedSpace трябва да е Count, а Length да е Сapacity (имам предвид при дотнетърската имплементация на List

от georgiwe (720 точки)

0
Мерси колега, точно от такива мнения имам нужда. Подредбата ще я оправя. Прав си за дублирането на метода с индексатора, прав си и за IsIndexValid. За Array пропъртито отново си прав. :D Всъщност то не ми трябва да го извиквам от друг клас. Единствено в тестовете го ползвам за да взема дължината на array, но пък за него имам пропърти Length, което би трябвало да ползвам.

от d.brezoev (212 точки)


0
https://github.com/Producenta/DefiningClassesPartTwo5-7Tasks/tree/master
Доста интересна задача, сравнително лесна беше малко в началото не можех да се сетя за Мин и Макс, ама и то се оказа лесно. Приемам всякакви критики и съвети.

от Ilian987 (387 точки)


0

Както винаги, възможно най-праволинейните решения. Честно казано, не бих си ползвал списъка в реална ситуация - просто му нямам доверие, защото не е тестван сериозно. -> линк

Концепция на решението:

- Всичко се случва около indexer-a, което ми гарантира, че работя с броя на реалните стойности в списъка, a през пропъртито му си осигурявам, че ще се Resize-не в точния момент.


от miroslav.tsakov (1476 точки)


0
Така написана проверката в самия indexer се изпълнява излишно при всяка операция с него - според мен е по-разумно да проверяваш дали има нужда от удвояване само като добавяш елемент - само там има възможност да не ти стигне мястото.

от dzhenko (3893 точки)

0
Така си е, а аз се събудих и с друго прозрение, че като запълня списъка ще се resize-не без да е сигурно, че ще е необходимо занапред. Първоначалната ми идея да минава проверката през пропъртито беше за евентуални случаи, в които ще се добавят повече от един елемент, но за тази реализация е излишно.

от miroslav.tsakov (1476 точки)



0
Здравейте,
Не знам да ли е правилната тема да питам, но възможно ли е листа, който сме си създали да може да се цикли с foreach примерно. Пробвах с IEnumerable, но не се получава и не ми е много ясно.

от Tanis (75 точки)


0
Ако направиш класа да наследява IEnumerable трябва да стане... Дай код, за да можем да ти помогнем по-добре.


0
Имплементираш си клас, който представлява лист и искаш да можеш да използваш for-each на него - ако съм те разбрал правилно трябва да наследиш интерфейса IEnumerable

от Hachiko (380 точки)



0
Здравейте! Имам следния проблем при компилацията на кода:
http://pastebin.com/dWu378td
http://pastebin.com/pPAZA96a
Винаги ми изкарва грешките: " 'Point3D.Point' does not implement interface member 'System.IComparable.CompareTo(object)' " и " 'Point3D.Point' does not implement interface member 'System.IComparable.CompareTo(Point3D.Point)' " Някакви идеи как мога да го оправя?
Благодаря за отговорите.

от tedo_b (10 точки)


0
след като си наследил в даден клас даден интерфейс трябва задължително да имплементираш всичките му методи. Всъщност това е основната идея на интерфейсите - те са един вид договор. Щом наследяваш IComparable ти казваш на всички, които ще ползват този клас, че инстанцираните обекти от този клас ще може да се сравняват чрез метода CompareTo(). Това което конкретно си пропуснал е да имплементираш метода CompareTo() в твоя клас - за това ти и гърми програмата.

от wnvko (3123 точки)


0
Здравейте! Това е решението ми на 7-ма задача
https://gist.github.com/tedob/a72315832800ee7973db
Въпросът ми е относно реaлизацията на методът CompareTo() в класът GenericList.cs. В повечето решения видях, че Min се намира само с един подаден параметър на методът CompareTo() от класът GenericList. На мен ми се наложи да направя статично св-во Point.FirstPoint в структурата Point.cs, за да мога да изпратя 2-рия параметър с който ще бъде сравняван първия. Не мiсля, че това е най-добрия вариант. В тази връзка бих искал да ви попитам за идея как може да се реализира методът CompareTo()? Има ли вариант за решение в който структурата да не реализира ICompareble, тъй като прочетох, че не е желателно това да се случва? Благодаря предварително!

от tedo_b (10 точки)


0
В класа (в твоят случай е структура, но по-добре го направи клас) Point в метода CompareTo вместо "firstPoint.X.CompareTo(SecondPoint.X);" напиши "this.X.CompareTo(SecondPoint.X);". Същи така щом сравняваш е добре да сравниш всички пропъртита дали са с еднакви стойности, а не само X. Относно структурата, щом имаш допълнителни методи, а не само пропъртита за x, y, z и конструктор, т.е. използваш го за повече от просто данни би следвало да е клас.


0
Мерси! Това ме интересуваше. Относно сравнението на точките в първия пример съм го направил принципно.
https://gist.github.com/tedob/a12954fcf9b57e3db2b2
В последния вариант използвам методът CalculateDistance(Point point1, Point point2) от класът Point и спрямо разтоянието от началото на координатната система до точката определям Min.

от tedo_b (10 точки)