4

我在这里的第一篇文章。

我有一个列表"<"frameworkelement>,我正在填充一个选择过程。每个框架元素都有一个保存其 ZOrder 的 uid。

我需要按 ZOrder 从低到高对这些进行排序。我可以使用列表框来获取它并像这样添加 Uid:

            //Add Object Uid's
            ListBox lstTempOrder = new ListBox();
            foreach(FrameworkElement feObject in MainWindow.Data.SelectedObjects)
            {
                lstTempOrder.Items.Add(feObject.Uid);
            }
            //Reorder from 0 to above of the ZIndexes       
            lstTempOrder.Items.SortDescriptions.Add(new System.ComponentModel.SortDescription("", System.ComponentModel.ListSortDirection.Ascending));

但我需要用 List"<"FrameWorkElement> 和 Sort 来做到这一点。

这是我填充 List"<"T> 的代码(SelectedObjects 和 CopyObjectsCollections 是 List"<"FrameWorkElement>" 列表。

            foreach(FrameworkElement feObject in MainWindow.Data.SelectedObjects)
            {
                MainWindow.Data.CopyObjectsCollection.Add(feObject);
            }

我看过 CollectionViewSource 和 IComparer 但我真的无法理解它。

4

1 回答 1

4

我可能错过了您的问题,但如果您只想对您的 进行排序List<T>,那么您为什么不直接使用该LinQ OrderBy方法呢?

MainWindow.Data.CopyObjectsCollection = 
    MainWindow.Data.CopyObjectsCollection.OrderBy(f => f.Uid).ToList();

如果这对您的要求进行了错误的排序,那么您可以使用它:

MainWindow.Data.CopyObjectsCollection = 
    MainWindow.Data.CopyObjectsCollection.OrderByDescending(f => f.Uid).ToList();

更新>>>

OrderBy是一种LinQ扩展方法。在您的班级顶部添加using System.Linq;以使用它。f与您的FrameworkElement对象的实例有关。上面的 lambda 表达式基本上意味着“使用Uid属性值排序”。

更新 2 >>>

OrderBy方法不会改变原始集合......这就是为什么我的示例将集合设置为该OrderBy方法的结果。请参阅此基本示例:

List<FrameworkElement> elements = new List<FrameworkElement>();
elements.Add(new FrameworkElement() { Uid = "Object1003-1" });
elements.Add(new FrameworkElement() { Uid = "Object1002-2" });
elements.Add(new FrameworkElement() { Uid = "Object1002-1" });
elements.Add(new FrameworkElement() { Uid = "Object1001-1" });
elements.Add(new FrameworkElement() { Uid = "Object1001-3" });
elements.Add(new FrameworkElement() { Uid = "Object1001-2" });
string result = string.Join(", ", elements.Select(f => f.Uid));
elements = elements.OrderBy(f => f.Uid).ToList();
string orderedResult = string.Join(", ", elements.Select(f => f.Uid));

通过比较 和 的值,resultorderedResult可以看到这对它们进行了完美排序。

更新 3(希望是最后一个)>>>

伙计,您需要了解 Lambda 表达式...查看 MSDN 上的Lambda 表达式(C# 编程指南)页面以获取更多信息。

elements = elements.OrderBy(f => f.Uid).ToList();

fLambda 表达式中的 ' ' 之前=>此表达式中声明。用一个字母来命名这些参数是相当标准的,例如Exceptions,但我们可以将其命名为任何名称:

elements = elements.OrderBy(frameworkElement => frameworkElement.Uid).ToList();
于 2013-08-30T08:51:40.857 回答