我想按字母順序排序ObservableCollection,因爲我不想創建另一個綁定。我見過我們可以使用Linq和OrderBy方法。我還想使用個人IComparer,因爲我將不得不組織複雜的數據(列表到其他列表),但VS告訴我我不能使用我自己的比較器:使用Linq和IComparer排序ObservableCollection
(給你錯誤的鏈接,因爲我的VS是法語)
http://msdn.microsoft.com/en-gb/library/hxfhx4sy%28v=vs.90%29.aspx
任何想法?
private void SortGraphicObjectsAscending(object sender, RoutedEventArgs e)
{
GraphicObjects.OrderBy(graphicObject => graphicObject.Nom, new GraphicObjectComparer(true));
}
和我自己的比較器(這已經是測試)
public class GraphicObjectComparer : IComparer<GraphicObject>
{
int order = 1;
public GraphicObjectComparer(Boolean ascending)
{
if (!ascending)
{
order = -1;
}
}
public GraphicObjectComparer()
{
}
public int Compare(GraphicObject x, GraphicObject y)
{
return String.Compare(x.Nom, y.Nom, false) * order;
}
}
謝謝您的回答。無論如何,我有另一個問題。正如邁克爾所說,我使用更復雜的比較器,但是用於另一個實體。該實體以分層樹顯示,並且對象可能包含相同類型的其他對象的列表。
我無法測試我的GraphicObject,因爲我沒有訪問數據庫(目前沒有任何對象)。通過我的VideoEntity上的測試,看起來我的ObservableCollection沒有按照我想要的方式排序(我創建了另一個)。我想按字母順序將其反轉,但不起作用。
public class VideoEntityComparer : IComparer<VideoEntity>
{
int order = 1;
public VideoEntityComparer(Boolean ascending)
{
if (!ascending)
{
this.order = -1; // so descending
}
}
public VideoEntityComparer()
{
}
public int Compare(VideoEntity x, VideoEntity y)
{
if ((x is BaseDirectory && y is BaseDirectory) || (x is BaseSite && y is BaseSite) || (x is VideoEncoder && y is VideoEncoder))
{
return string.Compare(x.Nom, y.Nom, false) * order; // only objects of the same type are sorted alphabetically
}
else if ((x is BaseDirectory && y is BaseSite) || (x is BaseSite && y is VideoEncoder))
{
return -1;
}else
{
return 1;
}
}
}
private void SortDirectoriesDescending(object sender, RoutedEventArgs e)
{
ObservableCollection<BaseDirectory> tempDir = new ObservableCollection<BaseDirectory>(
Directories.OrderBy(directory => directory, new VideoEntityComparer(false)));
Directories = tempDir;
}
PS:順便說一下,我是作用於DependancyProperty。這是做正確的方法嗎? (我是WPF的新手)