none
Работа с generic классом переопределение ToString RRS feed

  • Вопрос

  • Добрый день,
    Нужна помощь , есть класс generic
    который способен принимать набор(set) 
    и производить над ним операции
    Объединение(Union) пересечение(Intersect) и проверка если объект 
    уже находится в наборе(IsMember).
    внутри класса я использую List< Т >
    проблема с переопределением ToString 

    работа происходит в консоле 
    программа не как не хочет использовать
    переопределенный вывод на экран .

    Как добится что-бы при выводе на экран использовался
    переопределенный метод ToString().

    P.S. пробовал наследование oт List<Т>  не помогло,
    хотелось бы вариант без exctension methods.


    буду благодарен за помощь.
    код ниже . 

        class Set<T> : IEnumerable<T> where T : IComparable<T>, IEquatable<T>
        {
            // Data member //
            private List<T> _innerList;
            ///////////////////////////
    
            #region // Constructors //
    
            /// <summary>
            /// Initialize new instance of set
            /// with received parameter
            /// </summary>
            /// <param name="setParameters">parameters in set</param>
            public Set(params T[] setParameters)
            {
                this._innerList = new List<T>(setParameters);
            } // end of Set constructor
    
            /// <summary>
            /// Initialize new instance of set
            /// with other set values
            /// </summary>
            /// <param name="newSet">source set</param>
            public Set(Set<T> newSet)
            {
                this._innerList = new List<T>(newSet._innerList);
            } // end of Set constructor
    
            /// <summary>
            /// Initialize new instance of empty set
            /// </summary>
            protected Set()
            {
                this._innerList = new List<T>();
            }  // end of Set constructor
    
            #endregion
    
    
    
            #region // Methods //
    
            /// <summary>
            /// Checks if set has a given member
            /// </summary>
            /// <param name="member">member to check</param>
            /// <returns>True if member within the set, otherwise False</returns>
            public bool IsMember(T member)
            {
                return this.Contains(member);
            } // end of IsMemeber
    
            /// <summary>
            /// Perform intersection
            /// between two sets
            /// </summary>
            /// <param name="newList">list to perform intersection with</param>
            /// <returns>new set, contains members that intersect in both sets</returns>
            public Set<T> Intersect(Set<T> newList)
            {
                Set<T> tempList = new Set<T>();
    
                for (int i = 0; i < newList._innerList.Count; i++)
                {
                    if (this._innerList.Contains(newList._innerList[i])) // if member intersects in both sets
                        if (!tempList._innerList.Contains(newList._innerList[i])) // if this member doesn't exist yet in the tempList 
                            tempList._innerList.Add(newList._innerList[i]); // add member
                } // end of for
                return tempList;
            } // end of Intersect
    
            /// <summary>
            /// Perform union of
            /// two sets' members
            /// without duplications
            /// </summary>
            /// <param name="newList">list to perform union with</param>
            /// <returns>new set of members, from both sets</returns>
            public Set<T> Union(Set<T> newList)
            {
                Set<T> tempList = new Set<T>(this);
    
                for (int i = 0; i < newList._innerList.Count; i++)
                {
                    if (!this._innerList.Contains(newList._innerList[i])) // if set doesn't contain already this member
                    {
                        tempList._innerList.Add(newList._innerList[i]); // add member
                    } // end of if
    
                } // end of for
                return tempList;
            } // end of Union
    
    
            #endregion
    
    
      
            // Override ToString()
            public override string ToString()
            {
                StringBuilder sb = new StringBuilder();
    
                foreach (var item in this._innerList)
                {
                    sb.AppendFormat(" {0} ", item);
                }
                return sb.ToString();
    
            } // end of ToSTring()
    
            #region // IEnumerator Implementation //
            public IEnumerator<T> GetEnumerator()
            {
                foreach (var item in this._innerList)
                {
                    yield return item;
                }
            } // end of GetEnumerator()
    
            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
            {
                foreach (var item in this._innerList)
                {
                    yield return item;
                }
            } // end of System.Collections.IEnumerable.GetEnumerator()
            #endregion
    
    
        } // end of Set class

Ответы

  • Замените
    foreach (var item in resultList)
    {
        Console.Write(item);
    }
    на
    Console.Write(resultList);
    • Помечено в качестве ответа Konrud 6 июля 2013 г. 11:05
    6 июля 2013 г. 10:33
  • Так вы в этом случае переопределяете метод коллекции, а вызываете метод параметра. Ваш переопределённй метод ToString() уже проходит по коллекции и собирает строку, поэтому нет нужды повторно проходить по ней ещё раз. Вызов метода ToString на объекте коллекции, это скорее всего то, что вам нужно.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Konrud 6 июля 2013 г. 11:05
    6 июля 2013 г. 10:47
    Модератор

Все ответы

  • Судя по тому, что привели вы всё должно работать. Если вызов такой:

    Set<int> s = new Set<int>(1,2,3);
    Console.WriteLine(s.ToString());

    Если вы по другому вызываете метод, то покажите как.


    Сделаем содержимое сообщества лучше, вместе!

    6 июля 2013 г. 10:04
    Модератор
  • Мой вызов метода:

                Set<string> arr = new Set<string>("one", "two", "three", "four");
    
    
    
                Set<string> arr2 = new Set<string>("three", "three", "four", "six");
    
    
                Set<string> resultList = arr.Intersect(arr2);
    
               
    
                foreach (var item in resultList)
                {
                    Console.Write(item);
                }

    6 июля 2013 г. 10:24
  • Замените
    foreach (var item in resultList)
    {
        Console.Write(item);
    }
    на
    Console.Write(resultList);
    • Помечено в качестве ответа Konrud 6 июля 2013 г. 11:05
    6 июля 2013 г. 10:33
  • Так вы в этом случае переопределяете метод коллекции, а вызываете метод параметра. Ваш переопределённй метод ToString() уже проходит по коллекции и собирает строку, поэтому нет нужды повторно проходить по ней ещё раз. Вызов метода ToString на объекте коллекции, это скорее всего то, что вам нужно.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Konrud 6 июля 2013 г. 11:05
    6 июля 2013 г. 10:47
    Модератор
  • Спасибо большое, всё работает !
    6 июля 2013 г. 11:05