如何对对象列表进行排序?OrderBy c#

如何对对象列表进行排序?OrderBy c#,c#,C#,我有曲目课 class Track { public String Name { get; set; } public Double Duration; public Boolean IsRemix; public override string ToString() { if (IsRemix) return Name + "(Remix) " + Duration; return Name + " " + Durati

我有
曲目

class Track
{
    public String Name { get; set; }
    public Double Duration;
    public Boolean IsRemix;

    public override string ToString()
    {
        if (IsRemix) return Name + "(Remix) " + Duration;
        return Name + " " + Duration;
    }
}
相册是一个列表:

class Album :List<Track>
    {
        public Album SortByAlphabet()
        {
            return new Album().OrderBy(x=>x.Name);
        }
    }

没用

这是

正在引发异常,InvalidCastException

class Album : List<Track>
{
    public Album SortByAlphabet()
    {
        return (Album)(this.OrderBy(o => o.Name).ToList());
    }
}
class相册:列表
{
公共相册Sortbylphabet()
{
return(相册)(this.OrderBy(o=>o.Name.ToList());
}
}

我不建议从列表继承,但如果您这样做,以下内容应满足您的要求:

class Album : List<Track>
{
    public Album() : base() { }

    public Album(IEnumerable<Track> tracks) : base(tracks) { }

    /// <summary>
    /// Sort in place the album of tracks alphabetically by name 
    /// </summary>
    public void SortByAlphabet()
    {
        Sort((t1, t2) => t1.Name.CompareTo(t2.Name));
    }

    /// <summary>
    /// Return a new Album with tracks sorted alphabetically by name.
    /// </summary>
    /// <returns></returns>
    public Album OrderByAlphabet()
    {
        return new Album(this.OrderBy(t => t.Name));
    }
}
class相册:列表
{
公共相册():基(){}
公共专辑(IEnumerable曲目):基本(曲目){}
/// 
///按名称的字母顺序对唱片集进行就地排序
/// 
public void SortByAlphabet()
{
排序((t1,t2)=>t1.Name.CompareTo(t2.Name));
}
/// 
///返回按名称字母顺序排列的曲目的新专辑。
/// 
/// 
公共相册OrderByAlphabet()
{
返回新相册(this.OrderBy(t=>t.Name));
}
}

不从
列表继承

专辑有一个歌曲列表,你可以用一个成员来表示。它使用了
跟踪的实现(老实说,我不会使用
布尔值
双值
,等等,也不会有裸露的公共字段,但这是另一个讨论。)


我建议不要从
列表继承。您可以找到更多信息。
OrderBy()
不会对集合进行排序,而是按排序顺序在集合上迭代。如果您想对列表进行排序,请致电。。。这就是它存在的原因。引发异常时,InvalidCastException考虑建议指定
String.Compare()
,并允许区域性敏感的比较。我当然和你一样担心
相册
充当`列表
、排序器和
比较器'。
class Album : List<Track>
{
    public Album SortByAlphabet()
    {
        return (Album)(this.OrderBy(o => o.Name).ToList());
    }
}
class Album : List<Track>
{
    public Album() : base() { }

    public Album(IEnumerable<Track> tracks) : base(tracks) { }

    /// <summary>
    /// Sort in place the album of tracks alphabetically by name 
    /// </summary>
    public void SortByAlphabet()
    {
        Sort((t1, t2) => t1.Name.CompareTo(t2.Name));
    }

    /// <summary>
    /// Return a new Album with tracks sorted alphabetically by name.
    /// </summary>
    /// <returns></returns>
    public Album OrderByAlphabet()
    {
        return new Album(this.OrderBy(t => t.Name));
    }
}
class Album {
  private readonly List<Track> _tracklist;
  public ReadOnlyCollection<Track> Tracklist {
    get {
      return new ReadOnlyCollection<Track>(_tracklist);
    }
 }

  public Album(IEnumerable<Track> tracklist) {
    _tracklist = new List<Track>(tracklist);
  }
}
var album = new Album(new List<Track> {
  new Track { Name = "Blonde"}, 
  new Track { Name = "K.-O."}, 
  new Track { Name="Alcaline"}, 
  new Track { Name="Seulement pour te plaire"}, 
  new Track { Name="L'amour renfort"},
  new Track { Name="Bi"},
  new Track { Name="Mon planeur"},
  new Track { Name="Ce qui tue l'amour"},
  new Track { Name="Tweet"},
  new Track { Name="Charles est stone"},
  new Track { Name="Mylène Farmer"},
  new Track { Name="Plus de bye bye"}
});

var culture = new CultureInfo("fr-FR");
var tracks = album.Tracklist.OrderBy(t => t.Name, StringComparer.Create(culture, false));
tracks.ToList().ForEach(Console.WriteLine);