c# - 对项目列表进行排序的通用方法
问题描述
我有两个类,它们有两个共同的属性Id
和SortNumber
. 我想要一种通用方法来对所述类列表中的项目进行排序。
是否可以不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;
}
}
}
解决方案
您可以为 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)
{
// ....
}
然后您可以像往常一样使用“属性”,但以后任何重命名都可能导致崩溃。
实际上,这一切都取决于您不使用界面的目的,这对我来说并不清楚。
推荐阅读
- sql - 如何编写 CTE 来聚合分层值
- django - 为什么 GET 和 POST 请求转换为 OPTIONS 请求,用于 django rest 框架和 reactjs 前端的跨域请求?
- powershell - Powershell 脚本 - 数据未传递到 export-csv
- php - 为什么 cron 作业没有在 cpanel 经销商俱乐部的某个指定时间运行
- javascript - 使用 JAVASCRIPT REDUCE 构建 2 个数组的数组,其中一行使用三元运算符
- amazon-web-services - 完成所有工作后同步所有工作人员
- dataframe - DEEDLE:如何创建空数据框并添加系列
- swift - macOS:有没有办法在不崩溃的情况下访问窗口控制器?
- r - 在 R 中按组创建组合
- docker - 如何在 Kubernetes 中使用 azure devops 部署 docker 容器?