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

时间:2010-03-18 20:12:57

标签: c# .net arrays sorting c#-2.0

我有一个有2个字符串和1个双倍(金额)的课程。

班捐赠者

  • 字符串名称
  • 字符串评论
  • 双倍金额

现在我已经填充了一系列捐款人 我如何按金额排序?

7 个答案:

答案 0 :(得分:22)

如果您实施IComparable<Donator>,您可以这样做:

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

然后,您可以根据需要调用sort,比如说:

var donors = new List<Donator>();
//add donors
donors.Sort();

.Sort()调用您实施的CompareTo()方法进行排序。

还有没有IComparable<T>的lambda替代方案:

var donors = new List<Donator>();
//add donors
donors.Sort((a, b) => a.amount.CompareTo(b.amount));

答案 1 :(得分:4)

通过实施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

答案 2 :(得分:4)

您还可以使用delegates

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

答案 3 :(得分:3)

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

List<Donator> MyList;

然后我调用MyList.Sort

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

这是一种无需实现接口的排序。这是使用通用列表

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

答案 6 :(得分:0)

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

http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx

这样,您可以为所需的每种特定排序设置不同的类。您可以创建一个按名称,金额或其他方式排序。