【问题标题】:C# sort static class listC#排序静态类列表
【发布时间】:2016-11-20 14:51:06
【问题描述】:

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

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

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

【问题讨论】:

  • 除此之外,我强烈建议您开始遵循 .NET 命名约定。我也会尽量远离静态变量。
  • 您无法精确比较两个静态类的实例,因为您无法创建静态类的实例。您甚至无法将此类的实例添加到列表中,正是因为您无法创建它的实例。静态类如何参与列表和排序?你能详细说明一下吗?

标签: c# list class sorting


【解决方案1】:

使用 Linq,您可以在循环之前订购:

foreach(var b in business.Get().OrderBy(x=> x.name))
{


}

或者添加一个方法:

public static IEnumerable<businessVal> GetOrderedByName() 
{
   return _list.OrderBy(x=> x.name); 
}

按收入排序的方法相同。

您在 cmets 中请求的通用属性选择器:

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 之前,您应该考虑一下您拥有什么样的系统架构。 Linq 很棒,不要误会我的意思,但它并不总是计算上最有效的解决方案。我发现在某些游戏开发场景中,例如,特定的硬件设置使 Linq 不如其他解决方案有效。然而,我认为 99% 的情况下,这可能是最方便、有据可查且最容易实现的方法:)
  • Here 是对这个话题的讨论,来自比我更了解这个话题的人。
  • 感谢您的回答和提示。是否也可以定义一个通用的排序函数并将属性名称传递给它,然后它应该按它排序?
  • @charleshendry mmm...OrderBy 已经是一种通用的排序方法(我的回答中的第一种方法),您可以选择所需的属性名称。你可以自己做一个方法,但你会重新发明轮子。但是,如果您的意思是属性选择器是通用的,那么这是可能的,请检查编辑后的答案。
  • @user3185569 是的,我的意思是属性选择器是通用的。谢谢!
【解决方案2】:

您可以尝试为此目的使用 LINQ:

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

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

【讨论】:

  • 如果他需要实现IComparableCompareTo方法呢?
  • @AnkushMadankar 因为您无法在静态类中实现接口,所以我看不到任何替代解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多