C# 排序静态类列表
本文关键字:列表 静态类 排序 | 更新日期: 2023-09-27 17:57:17
我有一个名为全局的脚本.cs我在其中存储从其他脚本访问的全局变量。我在那里定义了以下类:
public static class business {
static List<businessVal> _list;
static business() {_list = new List<businessVal>();}
public static void Add (businessVal value) {_list.Add(value);}
public static IEnumerable<businessVal> Get () {return _list;}
public static businessVal GetItem (string name) {return _list.SingleOrDefault(li => li.name.Equals(name));}
}
public class businessVal {
public string name {get; set;}
public int income {get; set;}
}
我可以将项目添加到列表中并从其他脚本返回完整列表。我想做的是在循环浏览列表元素之前能够按name
或income
对列表进行排序。
我尝试向类添加排序函数,如下所示,但在使用 IComparable 时收到一条错误消息,指出我无法在静态类上实现接口。这样做的节拍方式是什么?
public static class business: IComparable {
// ...
public int CompareTo(businessVal tag) {
return businessVal.income.CompareTo(tag.income);
}
}
使用 Linq 可以在循环之前进行排序:
foreach(var b in business.Get().OrderBy(x=> x.name))
{
}
或者添加一个方法:
public static IEnumerable<businessVal> GetOrderedByName()
{
return _list.OrderBy(x=> x.name);
}
同样适用于按收入排序。
您在评论中要求的通用属性选择器:
public static IEnumerable<businessVal> GetOrderedBy<T>(Func<businessVal, T> selector)
{
return _list.OrderBy(selector);
}
旁注:
你可能想重新思考你在这里做什么。将数据列表存储在静态类的静态字段中是非常非常糟糕的主意。特别是如果你有很多这样的数据,你的数据可能会变得很大。
此外,可能需要阅读有关在 .NET 中命名转换的信息。必须将类重命名为 Business
。
您也可以尝试将单行函数替换为以下速记(C# 6 功能):
public static IEnumerable<businessVal> Get () => _list;
您可以尝试将 LINQ 用于此目的:
var orderedByName = business.Get().OrderBy(b=>b.name);
或
var orderedByIncome = business.Get().OrderBy(b=>b.income);