首页 > 解决方案 > 对项目列表进行排序的通用方法

问题描述

我有两个类,它们有两个共同的属性IdSortNumber. 我想要一种通用方法来对所述类列表中的项目进行排序。

是否可以IOrderitem实现类Foo的接口Bar但仍然可以使用该方法MoveUp

还是反射是唯一的选择?过去几年主要编写 TypeScript 代码,所以对 C# 有点生疏。

public class Foo
{
   public int Id {get;set;}
   public int SortNumber {get;set;}
   // etc
} 

public class Bar
{
   public int Id {get;set;}
   public int SortNumber {get;set;}
   // etc
}

public interface IOrderitem
{
   int Id {get;set;}
   int SortNumber {get;set;}    
}

public static void MoveUp<T>(List<T> itemList, int id)
{
    for (int i = 0; i < itemList.Count; i++)
    {
        // reindex items
        var item = itemList[i] as IOrderItem;

        bool isItem = item.Id == id;

        if (isItem && i > 0)
        {
            // set item above eventinfo item to one position lower (0 = top rest lower)
            (itemList[i - 1] as IOrderItem).SortNumber = i;

            // set the item to move up one position higher (0 = top rest lower)
            item.SortNumber = i - 1;
            i++;
        }
        else
        {
            item.SortNumber = i;
        }
    }
}

标签: c#generics

解决方案


您可以为 Foo 和 Bar 实现一个基类并让其继承。

public class BaseClass
{
    public int Id { get; set; }
    public int SortNumber { get; set; }
    // etc
}
class Foo : BaseClass    {    }
class Bar : BaseClass    {    }

您可以使用动态的,而不是制作具有定义类型的 T 列表。但我不建议这样做。不推荐。请参阅链接使用动态是否被认为是一种不好的做法?

 public static void MoveUp(List<dynamic> itemList, int id)
    {
       // ....
    }

然后您可以像往常一样使用“属性”,但以后任何重命名都可能导致崩溃。

实际上,这一切都取决于您不使用界面的目的,这对我来说并不清楚。


推荐阅读