我有一个名为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;}
}
我可以在列表中添加项目并从其他脚本返回完整列表。我想做的是能够在循环遍历列表元素之前按name
或income
对列表进行排序。
我尝试在类中添加一个sort函数,如下所示,但是在使用IComparable时我收到一条错误消息,说我无法在静态类上实现接口。这样做的好处是什么?
public static class business: IComparable {
// ...
public int CompareTo(businessVal tag) {
return businessVal.income.CompareTo(tag.income);
}
}
答案 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);