C# 如何对自定义类数组进行排序?

C# 如何对自定义类数组进行排序?,c#,.net,arrays,sorting,c#-2.0,C#,.net,Arrays,Sorting,C# 2.0,我有一个有两个字符串和一个双倍(金额)的类 类捐赠者 字符串名 字符串注释 双倍金额 现在我已经有了一批捐赠者。 如何按金额排序?通过实现IComparable,然后使用Array.sort public class Donator : IComparable { public string name; public string comment; public double amount; public int CompareTo(object obj)

我有一个有两个字符串和一个双倍(金额)的类

类捐赠者

  • 字符串名
  • 字符串注释
  • 双倍金额
现在我已经有了一批捐赠者。

如何按金额排序?

通过实现
IComparable
,然后使用
Array.sort

public class Donator : IComparable {
    public string name;
    public string comment;
    public double amount;

    public int CompareTo(object obj) {
        // throws invalid cast exception if not of type Donator
        Donator otherDonator = (Donator) obj; 

        return this.amount.CompareTo(otherDonator.amount);
    }
}

Donator[] donators;  // this is your array
Array.Sort(donators); // after this donators is sorted

您可以使用
MyArray.OrderBy(n=>n.Amount)
如果您已经包含System.Linq命名空间。

如果您实现了,您可以这样做:

public class Donator :IComparable<Donator>
{
  public string name { get; set; }
  public string comment { get; set; }
  public double amount { get; set; }

  public int CompareTo(Donator other)
  {
     return amount.CompareTo(other.amount);
  }
}

例如,我总是使用通用列表

List<Donator> MyList;
列出MyList;
然后我打电话给MyList。排序

MyList.Sort(delegate (Donator a, Donator b) {
   if (a.Amount < b.Amount) return -1;
   else if (a.Amount > b.Amount) return 1;
   else return 0; );
MyList.Sort(委托人(捐赠人a、捐赠人b){
如果(a.金额b.金额)返回1;
否则返回0;);
您还可以使用:

类程序
{
静态void Main(字符串[]参数)
{
List myproviders=新列表();
//在我的捐赠者列表中添加内容。。。
排序(委托(施主x,施主y){返回x.amount.CompareTo(y.amount);});
}
}
阶级捐赠者
{
公共字符串名称;
公共字符串评论;
公共双倍金额;
}

这里是一个不需要实现接口的排序。这是一个通用列表

    List<Donator> list = new List<Donator>();
    Donator don = new Donator("first", "works", 98.0);
    list.Add(don);
    don = new Donator("first", "works", 100.0);
    list.Add(don);
    don = new Donator("middle", "Yay", 101.1);
    list.Add(don);
    don = new Donator("last", "Last one", 99.9);
    list.Add(don);
    list.Sort(delegate(Donator d1, Donator d2){ return d1.amount.CompareTo(d2.amount); });
List List=新列表();
捐赠者唐=新捐赠者(“第一”,“工作”,98.0);
列表。添加(don);
don=新捐赠者(“第一”,“工作”,100.0);
列表。添加(don);
don=新捐赠者(“中间”,“耶”,101.1);
列表。添加(don);
don=新捐赠者(“最后一个”、“最后一个”,99.9);
列表。添加(don);
排序(委托(施主d1,施主d2){返回d1.amount.CompareTo(d2.amount);});

另一种方法是创建一个实现IComparer的类,然后在Comparer类中传递重载


通过这种方式,您可以为所需的每个特定排序拥有不同的类。您可以创建一个类来按名称、数量或其他进行排序。

如果他不想创建新类,他也可以传递lambda表达式。尝试了它,但如何真正排序?我尝试了myArray=myArray.orderby…错误是:Fehler 1 Eine implizite Konverterung vom Typ“DongleDonatorSite.Donator[]”中的“System.Linq.iorderenumerable”是nicht möglich.Use.ToArray()将可枚举项转换回数组。您可能希望在末尾添加
.ToArray()
,或者更改将结果分配给的变量的类型。顺便说一句,在许多情况下,它更实用(但不总是在性能问题上)停止使用数组并开始使用通用列表。根据OP,他使用的是.NET2。0@Jeff哦,不,他肯定想使用捐赠的人。捐赠者是甜甜圈的鉴赏家。重复:这与A.Amount.CompareTo(b.Amount)相同好的。另外,使用我的方法,你可以先添加额外的逻辑来按数量排序,然后,如果数量相同,则添加名称,等等。对于这种情况,CompareTo更简单,我的示例只有在你需要更有趣的排序逻辑时才有用。我认为你缺少了一个wavy。实现IComparer的类可能是更好的方法。@eschne对这么简单的事情来说,这几乎总是矫枉过正。那怎么会“更好”呢"?他们可能需要以各种方式进行排序。DonorAmountComparer,DonorLastNameComparer,DonoramountLastNameComparer。@eschneider-这完全不在问题范围之内……但即使他们需要,在lambda中使用比较器还是要紧凑得多。使用比较器的决定将是个人偏好,而且我与h合作过的人都没有在过去的几年中,我选择了这种方式。我不同意,这完全是相关的。在大多数情况下,我同意你的观点,但在可能需要多个排序顺序的情况下,比较器是最好的方法。
MyList.Sort(delegate (Donator a, Donator b) {
   if (a.Amount < b.Amount) return -1;
   else if (a.Amount > b.Amount) return 1;
   else return 0; );
class Program
{
    static void Main(string[] args)
    {
        List<Donor> myDonors = new List<Donor>();
        // add stuff to your myDonors list...

        myDonors.Sort(delegate(Donor x, Donor y) { return x.amount.CompareTo(y.amount); });
    }
}

class Donor
{
    public string name;
    public string comment;
    public double amount;
}
    List<Donator> list = new List<Donator>();
    Donator don = new Donator("first", "works", 98.0);
    list.Add(don);
    don = new Donator("first", "works", 100.0);
    list.Add(don);
    don = new Donator("middle", "Yay", 101.1);
    list.Add(don);
    don = new Donator("last", "Last one", 99.9);
    list.Add(don);
    list.Sort(delegate(Donator d1, Donator d2){ return d1.amount.CompareTo(d2.amount); });