C#排序静态类列表

时间:2016-07-18 05:34:50

标签: c# list class sorting

我有一个名为globals.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对列表进行排序。

我尝试在类中添加一个sort函数,如下所示,但是在使用IComparable时我收到一条错误消息,说我无法在静态类上实现接口。这样做的好处是什么?

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您可以尝试使用LINQ来实现此目的:

var orderedByName = business.Get().OrderBy(b=>b.name);

var orderedByIncome = business.Get().OrderBy(b=>b.income);