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;}
}

我可以将项目添加到列表中并从其他脚本返回完整列表。我想做的是在循环浏览列表元素之前能够按nameincome对列表进行排序。

我尝试向类添加排序函数,如下所示,但在使用 IComparable 时收到一条错误消息,指出我无法在静态类上实现接口。这样做的节拍方式是什么?

public static class business: IComparable {
    // ...
    public int CompareTo(businessVal tag) {
        return businessVal.income.CompareTo(tag.income);
    }
}

C# 排序静态类列表

使用 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);