Monday, February 24, 2025

Generics example

 using NLog;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;


namespace ICS360.Models

{    

    public class PaginationHelper

    {

        private readonly ILogger _logger;


        public PaginationHelper(ILogger logger)

        {

            _logger = logger;

        }


        public JsonResult GetFilteredData<T>(

            List<T> sourceData,

            int take,

            int skip,

            string filter,

            Func<T, string> filterProperty,

            string[] selectedIds,

            Func<T, string> idProperty) where T : IBaseFilterResult

        {

            try

            {

                var filteredData = sourceData;


                // Apply filter search text if provided

                if (!string.IsNullOrEmpty(filter))

                {

                    filteredData = sourceData

                        .Where(item => filterProperty(item)

                            .IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0)

                        .ToList();

                }


                var total = filteredData.Count;


                // Sort with selected items first, then by display name

                var orderedData = filteredData

                    .OrderByDescending(item => selectedIds != null &&

                                              selectedIds.Contains(idProperty(item)))

                    .ThenBy(item => filterProperty(item))

                    .ToList();


                var pagedData = orderedData

                    .Skip(skip)

                    .Take(take)

                     .Select(item =>

                     {

                         item.IsSelected = selectedIds != null && selectedIds.Contains(idProperty(item));

                         return item;

                     })                     

                    .ToList();


                return new JsonResult

                {

                    Data = new { Data = pagedData, Total = total },

                    JsonRequestBehavior = JsonRequestBehavior.AllowGet

                };

            }

            catch (Exception ex)

            {

                _logger.Error(ex);

                return new JsonResult

                {

                    Data = new { Data = new List<T>(), Total = 0 },

                    JsonRequestBehavior = JsonRequestBehavior.AllowGet

                };

            }

        }


        public JsonResult GetIndicesByIds<T, TId>(

       List<T> sourceData,

       List<TId> ids,

       Func<T, TId> idProperty) where TId : IEquatable<TId>

        {

            if (ids == null || !ids.Any())

            {

                return new JsonResult

                {

                    Data = new List<int>(),

                    JsonRequestBehavior = JsonRequestBehavior.AllowGet

                };

            }


            try

            {

                var indices = ids

                    .Select(id => sourceData.FindIndex(item => idProperty(item).Equals(id)))

                    .Where(index => index >= 0)

                    .ToList();


                return new JsonResult

                {

                    Data = indices,

                    JsonRequestBehavior = JsonRequestBehavior.AllowGet

                };

            }

            catch (Exception ex)

            {

                _logger.Error(ex);

                return new JsonResult

                {

                    Data = new List<int>(),

                    JsonRequestBehavior = JsonRequestBehavior.AllowGet

                };

            }

        }

    }

}

No comments:

Post a Comment