В.NET существует ли класс SortedList <T>?

Строгие стандарты: нестатический метод [& lt; class> :: & lt; method>] не следует называть статически

Происходит при попытке вызова не- статический метод для класса, поскольку он был статичным, и вы также имеете флаг E_STRICT в настройках error_reporting().

Пример:

class HTML {
   public function br() {
      echo '
'; } }

HTML::br() или $html::br()

Вы действительно можете избежать этой ошибки, не добавляя E_STRICT к error_reporting(), например

error_reporting(E_ALL & ~E_STRICT);

, поскольку, как и для PHP 5.4.0 и выше, E_STRICT включен в E_ALL [ ref ]. Но это не рекомендуется. Решение состоит в том, чтобы определить вашу предполагаемую статическую функцию как фактическую static:

public static function br() {
  echo '
'; }

или вызвать функцию условно:

$html = new HTML();
$html->br();

Похожие вопросы:

26
задан Robert MacLean 9 March 2016 в 10:57
поделиться

6 ответов

Может быть, я медленный, но разве это не самая легкая реализация?

class SortedList<T> : List<T>
{
    public new void Add(T item)
    {
        Insert(~BinarySearch(item), item);
    }
}

http://msdn.microsoft.com/en-us /library/w4e7fxsh.aspx


К сожалению, Add не удалось переопределить, поэтому мне пришлось new это не очень хорошо, когда у вас есть List<T> list = new SortedList<T>;, который я на самом деле нужно было сделать .... поэтому я пошел дальше и перестроил все это ...

class SortedList<T> : IList<T>
{
    private List<T> list = new List<T>();

    public int IndexOf(T item)
    {
        var index = list.BinarySearch(item);
        return index < 0 ? -1 : index;
    }

    public void Insert(int index, T item)
    {
        throw new NotImplementedException("Cannot insert at index; must preserve order.");
    }

    public void RemoveAt(int index)
    {
        list.RemoveAt(index);
    }

    public T this[int index]
    {
        get
        {
            return list[index];
        }
        set
        {
            list.RemoveAt(index);
            this.Add(value);
        }
    }

    public void Add(T item)
    {
        list.Insert(~list.BinarySearch(item), item);
    }

    public void Clear()
    {
        list.Clear();
    }

    public bool Contains(T item)
    {
        return list.BinarySearch(item) >= 0;
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        list.CopyTo(array, arrayIndex);
    }

    public int Count
    {
        get { return list.Count; }
    }

    public bool IsReadOnly
    {
        get { return false; }
    }

    public bool Remove(T item)
    {
        var index = list.BinarySearch(item);
        if (index < 0) return false;
        list.RemoveAt(index);
        return true;
    }

    public IEnumerator<T> GetEnumerator()
    {
        return list.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return list.GetEnumerator();
    }
}

Или, может быть, что-то вроде этого является более подходящей Remove функцией ...

    public bool Remove(T item)
    {
        var index = list.BinarySearch(item);
        if (index < 0) return false;
        while (((IComparable)item).CompareTo((IComparable)list[index]) == 0)
        {
            if (item == list[index])
            {
                list.RemoveAt(index);
                return true;
            }
            index++;
        }
        return false;
    }

Предполагая, что предметы могут сравниваться равными, но не равными ...

10
ответ дан mpen 28 November 2019 в 17:24
поделиться

Я задал подобный вопрос некоторое время назад, и существуют [приблизительно 110] хорошие ответы там . Там хороший набор наборов здесь .

3
ответ дан Community 28 November 2019 в 17:24
поделиться

В конце концов я решил написать:

class RealSortedList<T> : List<T>
    {
        public IComparer<T> comparer;

        public int SortItem(int index)
        {
            T item = this[index];
            this.RemoveAt(index);
            int goodposition=FindLocation(this[index], 0, this.Count);
            this.Insert(goodposition, item);
            return goodposition;
        }

        public int FindLocation(T item, int begin, int end)
        {
            if (begin==end)
                return begin;
            int middle = begin + end / 2;
            int comparisonvalue = comparer.Compare(item, this[middle]);
            if (comparisonvalue < 0)
                return FindLocation(item,begin, middle);
            else if (comparisonvalue > 0)
                return FindLocation(item,middle, end);
            else
                return middle;
        }
    }
3
ответ дан Brann 28 November 2019 в 17:24
поделиться

Не забывайте, что вставка объекта в список, поддержанный массивом, может быть дорогой операцией - вставка набора объектов и затем сортировки может быть более быстрой, если Вы действительно не должны сортировать после каждой операции.

, С другой стороны, Вы могли всегда обертывать список и заставлять Ваш добавлять, что операция находит правильное место и вставляет его там.

2
ответ дан Jon Skeet 28 November 2019 в 17:24
поделиться

Я решил эту проблему в прошлом, написав метод расширения, который выполняет бинарный поиск по IList, и другой метод, который выполняет вставку. Вы можете найти правильную реализацию в исходном коде CLR, потому что есть встроенная версия, которая работает только с массивами, а затем просто настроить ее как расширение для IList.

Одна из тех вещей, которые «должны быть в BCL уже».

1
ответ дан Daniel Earwicker 28 November 2019 в 17:24
поделиться

то, В чем я нуждаюсь, является классом SortedList с RefreshPosition (международный индекс) для перемещения только измененного (или вставленный) объект вместо того, чтобы обратиться целый список каждый раз объект в изменениях.

, Почему Вы обновили бы использование индекс , когда такие обновления делают недействительным индекс? Действительно, я думал бы, что обновление ссылкой на объект будет более удобным. Можно сделать, это с SortedList - просто помнит, что Ваш Key тип совпадает с типом возврата функции, которая извлекает сопоставимую форму данных объект.

class UpdateableSortedList<K,V> {
    private SortedList<K,V> list = new SortedList<K,V>();
    public delegate K ExtractKeyFunc(V v);
    private ExtractKeyFunc func;

    public UpdateableSortedList(ExtractKeyFunc f) { func = f; }

    public void Add(V v) {
        list[func(v)] = v;
    }
    public void Update(V v) {
        int i = list.IndexOfValue(v);
        if (i >= 0) {
            list.RemoveAt(i);
        }
        list[func(v)] = v;
    }
    public IEnumerable<T> Values { get { return list.Values; } }
}

Что-то как этот я предполагаю.

0
ответ дан Frank Krueger 28 November 2019 в 17:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: