Вид DataGridView и например, BindingList <T> в.NET

в контроллере входа используется метод intended.

public function login(Request $request)
{
    if ($this->guard()->attempt(...)) {
        return redirect()->intended(route('home'));
    } else {...}
}

он будет пытаться перенаправить на нужную страницу, прежде чем перехватится промежуточным ПО если он не может найти нужную страницу, он будет перенаправлен на страницу home.

11
задан Matthias Meid 10 April 2013 в 16:54
поделиться

3 ответа

Я высоко ценю решение Маттиаса за его простоту и красоту.

Однако, хотя это дает отличные результаты для небольших объемов данных, при работе с большими объемами данных производительность не так хороша из-за рефлексии.

Я провел тест с набором простых объектов данных, насчитывающим 100000 элементов. Сортировка по свойству целочисленного типа заняла около 1 минуты. Реализация, которую я собираюсь более подробно описать, изменила это значение на ~ 200 мс.

Основная идея состоит в том, чтобы извлечь выгоду из строго типизированного сравнения, сохранив общий метод ApplySortCore. Следующее заменяет общий делегат сравнения вызовом конкретного компаратора, реализованного в производном классе:

Новое в SortableBindingList :

protected abstract Comparison<T> GetComparer(PropertyDescriptor prop);

ApplySortCore изменяется на:

protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
{
    List<T> itemsList = (List<T>)this.Items;
    if (prop.PropertyType.GetInterface("IComparable") != null)
    {
        Comparison<T> comparer = GetComparer(prop);
        itemsList.Sort(comparer);
        if (direction == ListSortDirection.Descending)
        {
            itemsList.Reverse();
        }
    }

    isSortedValue = true;
    sortPropertyValue = prop;
    sortDirectionValue = direction;
}

Теперь,

18
ответ дан 3 December 2019 в 00:49
поделиться

Я погуглил и попробовал самостоятельно еще некоторое время...

Нет никакого встроенного пути в.NET до сих пор. Необходимо реализовать пользовательский класс на основе BindingList<T>. Один путь описан в Пользовательской Привязке данных, Часть 2 (MSDN). Я наконец произвожу другую реализацию ApplySortCore- метод для обеспечения реализации, которая не проекта зависима.

protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction)
{
    List<T> itemsList = (List<T>)this.Items;
    if(property.PropertyType.GetInterface("IComparable") != null)
    {
        itemsList.Sort(new Comparison<T>(delegate(T x, T y)
        {
            // Compare x to y if x is not null. If x is, but y isn't, we compare y
            // to x and reverse the result. If both are null, they're equal.
            if(property.GetValue(x) != null)
                return ((IComparable)property.GetValue(x)).CompareTo(property.GetValue(y)) * (direction == ListSortDirection.Descending ? -1 : 1);
            else if(property.GetValue(y) != null)
                return ((IComparable)property.GetValue(y)).CompareTo(property.GetValue(x)) * (direction == ListSortDirection.Descending ? 1 : -1);
            else
                return 0;
        }));
    }

    isSorted = true;
    sortProperty = property;
    sortDirection = direction;
}

Используя этого, можно отсортировать по любому участнику, который реализует IComparable.

25
ответ дан 3 December 2019 в 00:49
поделиться

Не для пользовательских объектов. В.Net 2.0 я должен был прокрутить мой при сортировке использования BindingList. Может быть что-то новое в.Net 3.5, но я еще не изучил это. Теперь, когда существует LINQ и опции сортировки, которые идут, если это теперь может быть легче реализовать.

0
ответ дан 3 December 2019 в 00:49
поделиться
Другие вопросы по тегам:

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