2015-10-06 4 views
0

Я хочу написать List самостоятельно. Итак, у меня есть класс List и класс ListItem. Теперь я хочу создать разные классы, например класс car. Я хотел бы вывести класс car из класса ListItem, чтобы я мог создать List автомобилей. Теперь класс List должен иметь разные методы, например, один C#. Я написал метод Add и Count, и оба они работают. Здесь идет сложная часть ... Я хочу написать Funktion, чтобы найти элемент в списке. Проблема в том, что я не могу просто сравнить их, потому что 1. Я не знаю, как будет выглядеть Objekt и какие члены он будет иметь. 2. Я не хочу сравнивать характеристики класса ListItem, потому что они не имеют отношения к реальному объекту, они просто актуальны для Списка.Как сравнить два сложных объекта?

Моя идея заключается в создании класса списка для каждого объекта, поэтому в моем примере это будет carList, который выводится из класса списка. Таким образом, я мог бы написать Methode, который знал бы, что сравнивать, потому что он будет знать объект ListItem. Теперь я не хочу создавать класс списка для каждого объекта, в котором я хочу иметь список. Должен быть другой способ: sice C# также дает вам тот же класс списка. Может ли кто-нибудь помочь?

+1

Ваш вопрос: «Может кто-нибудь помочь?» - ответ явно «Да, кто-то может помочь». Но, пожалуйста, поделитесь тем, что у вас есть, чтобы помочь вам, помогая вам легче. – Dietz

+0

@fubo Я не знаю, что вы имеете в виду ... Конечно, я даю объект искать как перегрузку для моей функции! –

+0

Можете ли вы дать нам предложенную подпись метода для метода «Найти»? Будет ли также метод «Содержит». – Gusdor

ответ

-1

Вы должны переопределить Equals (унаследованный от object) на вашем Car -класса:

class car 
{ 
    public override bool Equals(object other) { 
     var o = other as car; 
     if (o == null) return false; 

     if this.myProperty = o.myProperty return true; 

     return false; 
    } 
} 

Список будет использовать этот implenentation для обнаружения, если два автомобиля равны. В ваших Find -методе теперь вы можете просто позвонить по каждому пункту в списке, если он равен найденный один:

if (currentItemInList.Equals(searchItem)) // ... 

EDIT: При реализации Equals для любого класса вы должны всегда также осуществлять GetHashCode в случае, если объекты вашего класс хранятся в хешированных контейнерах, таких как Dictionary<TKey,TValue>. Если вы хотите прочитать далее см. MSDN for GetHashCode and Equals

+0

Если вы сами пишете всю реализацию списка, вы можете на самом деле назвать методы сравнения, потому что это вы их называете. Если может случиться так, что ваши объекты попадут в универсальные контейнеры, хотя вы, вероятно, должны реализовать 'IEquatable ', в дополнение к' object.Equals() '. Ср https://msdn.microsoft.com/en-us/library/ms131187%28v=vs.110%29.aspx. Вы должны точно также реализовать «GetHashCode()». –

+0

@PeterSchneider Конечно, вы правы, однако я старался держать его простым. Я также добавил HashCode. – HimBromBeere

+0

Хм ... Я думал, что 'GetHashCode()' важна только для словарей и, возможно, для других хешированных контейнеров, но не для общих тестов равенства. –

Смежные вопросы