C#动态数据集合ObservableCollection的三种排序方式

【三】ObservableCollection 与 List 的区别 本文对比了WPF中ObservableCollection与List的核心差异和应用场景。ObservableCollection支持集合变更通知,适合UI数据绑定和状态监控,但内存占用略高;List不支持通知,适用于后台数据处理和高频操作。在MVVM中,ObservableCollection可实现动态UI同步,而List需整体替换才能刷新界面。选择集合类型应根据是否需要自动通知机制决定,UI交互优先选ObservableCollection,纯后台处理选List更高效。 阅读详情

WPF中对ListBox、ListView、TreeView等实现数据双向绑定经常会用到ObservableCollection<T> 类。

ObservableCollection<T> 类    表示一个动态数据集合,它是实现了INotifyPropertyChanged 接口的数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。如果要实现集合中的某字段或属性发生改变时通知UI刷新界面,我们需要为这些字段或属性实现INotifyPropertyChanged接口,此接口公开CollectionChanged事件,只要基础集合发生更改,都能引发该事件。ObservableCollection<T> 类 的使用可以参考博客:https://www.cnblogs.com/santian/p/4366832.html,这里不做过多讲解。

ObservableCollection没有自带的sort排序功能,而实际使用时我们经常需要对数据集合进行排序后再显示,比如按照ID从小到大排序,或者按照禁用状态排序(可用的排在前面)等等。下面新建一个控制台应用程序SortDemo:

1、新建商品类Goods

//商品类
public class Goods
{
    public int Order { get; set; }
    public string Name { get; set; }
    public bool IsSoldOut { get; set; }
}

2、第一种排序方式

ocGoods = new ObservableCollection<Goods>(ocGoods.OrderByDescending(item => item.IsSoldOut));

程序代码:

static void Main(string[] args)
{
    ObservableCollection<Goods> ocGoods = new ObservableCollection<Goods>();
    ocGoods.Add(new Goods() { Order = 1, Name = "钢笔", IsSoldOut = true });
    ocGoods.Add(new Goods() { Order = 2, Name = "羽毛球", IsSoldOut = false });
    ocGoods.Add(new Goods() { Order = 3, Name = "毛巾", IsSoldOut = false });
    ocGoods.Add(new Goods() { Order = 4, Name = "零食", IsSoldOut = true });

    //按照IsSoldOut降序排列,即true在前面
    ocGoods = new ObservableCollection<Goods>(ocGoods.OrderByDescending(item => item.IsSoldOut));
    foreach (Goods item in ocGoods)
    {
        Console.WriteLine("Order:{0}  Name:{1}  IsSoldOut:{2}", item.Order, item.Name, item.IsSoldOut.ToString());
    }
    Console.ReadLine();
}

结果: 

2、第二种排序方式

自己写一个Sort扩展方法:

public static class ObservableExtension
{
    public static void Sort<T>(this ObservableCollection<T> collection) where T : IComparable<T>
    {
        List<T> sortedList = collection.OrderByDescending(x => x).ToList();//这里用降序
        for (int i = 0; i < sortedList.Count(); i++)
        {
            collection.Move(collection.IndexOf(sortedList[i]), i);
        }
    }
}

调用的时候报错: 

原来是Goods类没有实现IComparable<Goods>接口,修改Goods类:

//商品类
public class Goods : IComparable<Goods>
{
    public int Order { get; set; }
    public string Name { get; set; }
    public bool IsSoldOut { get; set; }

    public int CompareTo(Goods other)
    {
        return this.IsSoldOut.CompareTo(other.IsSoldOut);
    }
}

程序代码:

namespace SortDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            ObservableCollection<Goods> ocGoods = new ObservableCollection<Goods>();
            ocGoods.Add(new Goods() { Order = 1, Name = "钢笔", IsSoldOut = true });
            ocGoods.Add(new Goods() { Order = 2, Name = "羽毛球", IsSoldOut = false });
            ocGoods.Add(new Goods() { Order = 3, Name = "毛巾", IsSoldOut = false });
            ocGoods.Add(new Goods() { Order = 4, Name = "零食", IsSoldOut = true });

            ocGoods.Sort<Goods>();//第二种方法

            foreach (Goods item in ocGoods)
            {
                Console.WriteLine("Order:{0}  Name:{1}  IsSoldOut:{2}", item.Order, item.Name, item.IsSoldOut.ToString());
            }
            Console.ReadLine();
        }
    }

    //商品类
    public class Goods : IComparable<Goods>
    {
        public int Order { get; set; }
        public string Name { get; set; }
        public bool IsSoldOut { get; set; }

        public int CompareTo(Goods other)
        {
            return this.IsSoldOut.CompareTo(other.IsSoldOut);
        }
    }

    public static class ObservableExtension
    {
        public static void Sort<T>(this ObservableCollection<T> collection) where T : IComparable<T>
        {
            List<T> sortedList = collection.OrderByDescending(x => x).ToList();//这里用降序
            for (int i = 0; i < sortedList.Count(); i++)
            {
                collection.Move(collection.IndexOf(sortedList[i]), i);
            }
        }
    }
}

3、第三种排序方式

第二种方式的实质是使用List的特性,那么如果直接用List的Sort排序特性,则不用单独再实现IComparable接口。这里的思路是建一个List<Goods>列表,Sort后赋值给ObservableCollection<Goods>,代码:

static void Main(string[] args)
{
    List<Goods> goodsList = new List<Goods>();
    goodsList.Add(new Goods() { Order = 1, Name = "钢笔", IsSoldOut = true });
    goodsList.Add(new Goods() { Order = 2, Name = "羽毛球", IsSoldOut = false });
    goodsList.Add(new Goods() { Order = 3, Name = "毛巾", IsSoldOut = false });
    goodsList.Add(new Goods() { Order = 4, Name = "零食", IsSoldOut = true });
    goodsList.Sort(delegate (Goods b1, Goods b2) { return Comparer<bool>.Default.Compare(b2.IsSoldOut, b1.IsSoldOut); });

    ObservableCollection<Goods> ocGoods = new ObservableCollection<Goods>(goodsList);
    foreach (Goods item in ocGoods)
    {
        Console.WriteLine("Order:{0}  Name:{1}  IsSoldOut:{2}", item.Order, item.Name, item.IsSoldOut.ToString());
    }
    Console.ReadLine();
}

 

C# WPF入门学习主线篇(二十八)—— 使用集合(ObservableCollection) 在本篇文章中,我们详细介绍了`ObservableCollection`在WPF中的使用。通过定义和初始化`ObservableCollection`,将其绑定到UI控件,以及动态更新集合数据,我们可以创建一个响应式的用户界面。在实际开发中,`ObservableCollection`是非常有用的工具,可以帮助我们简化数据绑定的实现,提高应用程序的交互性和响应性。 阅读详情

相关推荐

WPF集合操控的8大生死劫!ObservableCollection添加/删除项,你真的掌握了吗?

🔥 WPF性能优化指南:ObservableCollection的8大核心技巧 本文针对WPF开发中常见的界面卡顿问题,深入剖析ObservableCollection的性能陷阱与优化方案。主要内容包括: 基础操作:演示添加/删除项的规范写法,避免UI刷新失效 批量处理:通过BeginInit/EndInit减少UI刷新次数,使1000项添加耗时从800ms降至50ms 线程安全:使用Dispatcher实现跨线程操作,避免崩溃 高级技巧:涵盖LINQ动态筛选、集合替换、深度绑定及异常处理 五大陷阱:指出

java专栏 1492

ObservableCollection和List的区别以及ObservableCollection 异步调用问题

ObservableCollection和List的区别总结 区别它们,最简单的方法就是看看他们继承的类和接口,还有它们的方法。(学习有技巧,会让你事半功倍,效率提升。) 学习 ObservableCollection比较简单,继承了Collection, INotifyCollectionChanged, INotifyPropertyChanged spa Collection:为泛型集合提供基类。code INotifyCollectionChanged:将集合的动态更改通知给侦听器,例如,什么时

kalvin_y_liu的博客 1万+

WPF中ObservableCollection 使用方法

当ObservableCollection添加一行时,会自动通知绑定该ObservableCollection的控件并做相应修改。如果希望当ObservableCollection中的属性发生改变时通知UI,则T也需要继承于INotifyPropertyChanged。WPF提供一个强大的类(ObservableCollection )可以简化我们对界面集合显示的增删改操作,并且无刷新,这无疑是对用户对我们程序员都非常有用的。接下来我们添加一个简易的界面。界面很粗糙,随意弄得。

qq_30725967的博客 4705

WPF_ObservableCollection基本使用及其注意项

ObservableCollection基本使用如上述代码示例所示。其中要注意的是,替换ViewModel中的绑定对象并不能真实替换ItemSource。还有ObservableCollection不是线程安全的,ItemSource绑定其后,不能跨线程(UI线程外)修改ObservableCollection,关于这点会另辟文进行介绍。

三千幻想乡 4658

Maxwell参数化建模

MAXWELL 2019 R3 参数化建模 参数化建模的优势 所谓参数化,就是在电机本体设计中涉及到的各类参数变量化,而每个变量之间又存在一定的制约关系,这样只需修改其中某个或者某些变量就可以做到对整个电机模型合理地改动。 参数化举例 以表贴式电机为例,先画电机定子,如上所示,依次进行后会弹出下面的选项框 上图就是描述电机尺寸的各类参数,接下来进行参数化。 回车ENTER,并给变量ds赋值。 赋值好后,回车ENTER 左下角properties里面就有我们新建立的变量ds了。 继续将剩余的参数

qq_41387280的博客 1万+

LabVIEW Modbus TCP通信避坑指南:解决连接中断、服务器异常与自动重连问题

本文详细解析了LabVIEW环境下Modbus TCP通信的常见问题,包括连接中断、服务器异常等,并提供了自动重连机制的实现方案。通过优化错误处理、超时参数和资源管理,帮助开发者构建更稳定的工业级Modbus TCP客户端,显著提升通信可靠性。

weixin_42525211的博客 422

C# ObservableCollection集合排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/BYH371256/article/details/83346807注意:ObservableCollection集合 直接使用OrderBy 等函数排序,有问题的,排序不改变,可以转成List在进行排序 命名空间:System.Collections.ObjectModle 在WPF中,绑定列表...

weixin_30894389的博客 346

【Flink on k8s】- 1 - Flink Kubernetes Operator 简介 2023

Flink Kubernetes Operator 可以与 Kubernetes 的其他功能和工具集成,可以帮助用户快速定位和解决问题。Flink Kubernetes Operator可以在Kubernetes上实现高可用性,以确保 Flink 集群的稳定性和可靠性。Flink Kubernetes Operator 可以快速地部署 Flink 集群,而无需手动配置和管理集群。Flink Kubernetes Operator可以将Flink集群与其他应用程序隔离,以避免资源争用和干扰。

欢迎来到我的博客,一起探索代码里的世界! 1344

C# 集合框架完全指南:从IEnumerable到ObservableCollection的深度解析

📝 总结要点 1. **List<T>是万金油** - 大部分场景的首选 2. **Dictionary用于快速查找** - 按键访问的最佳选择 3. **HashSet用于去重** - 集合运算的利器 4. **并发集合用于多线程** - 简化线程同步复杂度 5. **只读接口用于API设计** - 提高代码健壮性 6. **IEnumerable用于大数据集** - 延迟执行节省内存 这个表格可以作为日常开发的快速参考指南,帮助你根据具体需求选择最合适的集合类型!

ultramand的博客,重生之我在cad上二次开发猛猛敲C#代码~ 1104

Python爬虫实战:如何爬取京东商品评论数据

在本文中,我们介绍了如何使用 Python 爬虫技术爬取京东商品的评论数据。首先,我们分析了京东商品评论的 API 接口和 JSON 数据结构,然后编写了爬虫程序来抓取评论数据,并将数据保存到 CSV 文件中。接着,我们进行了一些基本的数据分析,包括评分分布和简单的情感分析。爬取京东商品评论的数据可以为电商分析、情感分析等提供有价值的信息。你可以在此基础上进行更深入的分析,挖掘更多的商业价值。希望本篇教程能够帮助你了解如何利用 Python 进行电商数据的爬取和分析!

2201_76125261的博客 1645

锐捷-GZ073 网络系统管理赛项赛题第1套A模块-S5配置

锐捷-GZ073 网络系统管理赛项赛题第1套A模块-S5配置

weixin_46183247的博客 767

WPF 对ObservableCollection 进行排序

WPF 对ObservableCollection 进行排序通过C#对ObservableCollection 进行排序方法一方法二在ObservableCollection上使用CollectionViewSource进行列表框实时排序 通过C#对ObservableCollection 进行排序 方法一 public static void MySort<TSource,TKey>(this ObservableCollection<TSource> observableColl

君子居易 3270

LabVIEW实现HTTP通信

本节简要介绍HTTP通信的基础知识,并以工业物联网平台TLINK中云端设备的数据发布设计为例,阐述互联网环境下HTTP客户端应用程序设计的基本方法。重点讲解工业物联网平台TLINK中HTTP设备的创建、通信数据帧的构造与测试。

不脱发的程序猿 1543

动态数据集合ObservableCollection的使用

在C/S架构中,常常会遇到动态更新数据,在不同的窗体中进行数据的动态操作,数据往往不能达到实时更新效果,而想要实现这一功能,C#中为我们提供了ObservableCollection类可以在添加,删除项目或刷新列表时提供属性变更通知,下面来总结一下ObservableCollection的使用。首先定义一个GlobalModel类,类中声明一个静态的动态集合,这样这个动态集合可以作为全局的变量进行使用: public class GlobalModel : ObservableObject {

weixin_44543129的博客 4844

【72】【OpenCV C++ & C#】 将cv::Mat 图像转换成imgINFO 传给c#在winform上显示,OpenCV C++如何将处理后的图像传给C#呢? 如何获取图像信息呢?

本文介绍了通过OpenCV C++处理图像后传递给C#的方法。首先定义了一个结构体imgINFO存储图像信息(数据指针、宽高、通道数等),然后通过getImgInfo函数将cv::Mat转换为该结构体。文章特别指出当图像宽度不能被4整除时可能出现失真问题,并给出了两种解决方案:调整输入图像或创建新的对齐图像。此外还解释了img.step和img.cols*img.elemSize()的关系,说明它们在大多数情况下是相等的。最后提到需要通过DLL将结构体传递给C#(具体方法参见其他文章)。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 696

使用DrissionPage实现携程酒店信息智能爬取

本文介绍了一个基于DrissionPage技术的携程酒店信息爬虫系统,通过监听API数据包实现高效采集。系统可自动获取酒店名称、价格、评分、位置等15个维度的数据,支持多页滚动加载和智能去重。相比传统爬虫,该方法直接解析API返回的JSON数据,避免了复杂的HTML解析和加密参数分析,提高了开发效率和稳定性。文章详细阐述了13个关键实现步骤,并强调数据采集应严格遵守法律法规,仅用于技术学习和市场研究。该系统可为旅游决策、价格监测等提供数据支持,但需注意合理使用频率和隐私保护。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 385

C# 基于ObservableCollection<T>实现集合排序

C# 基于ObservableCollection实现集合排序SortedObservableCollectionSortedObservableCollection<T, TKey> /// <summary> /// 使用<see cref="AddSorted"/>方法扩展<see cref="ObservableCollection{T}"/>,以将项目插入已排序的集合中。 /// </summary> pu

weixin_41045657的博客 846

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ObservableCollection动态数据集合根据对象属性排序

ObservableCollection results = new ObservableCollection(); result.ExportFiled = new ObservableCollection();//重新初始化对象 根据对象属性排序 result.ExportFiled = new ObservableCollection(result.ExportFiled.OrderBy(i

z18228597698的博客 2272

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ObservableCollection集合进行排序

ObservableCollection排序

沙漠飞鱼的博客 6662

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# ObservableCollection两个字段排序的情况

相对于System.Linq的OrderBy及OrderByDescending方法,调用后产生IOrderedEnumberable对象,这个对象为排序后的返回值,但原对象未发生变化。 试想,有这种需求,ObservableCollection调用排序方法后,此对象也跟着排序,怎么做呢?只能自己写个扩展方法了,方法内使用的冒泡排序算法,非常简单,当然使用是更简单、方便了。 注意:将方法写为扩...

weixin_30287169的博客 365

List和 ObservableCollection 的区别

动态添加元素时,UI无需手动刷新即可同步显示新数据。接口,当集合元素被添加、删除、替换或重置时,会自动触发。事件,通知绑定的UI控件更新(如WPF的。无内置变更通知机制。或重新赋值整个集合才能触发UI更新。在UI线程修改集合,避免跨线程异常。结合,实现筛选、排序等高级视图功能。同样非线程安全,需手动加锁(如。提供丰富的LINQ方法(如。),适合复杂数据查询与转换。语句)保护多线程访问。

lzt1027的博客 1142

C#开发-集合使用和技巧(一)常用集合和方法介绍

集合是C#中用于存储和管理一组对象的数据结构。它们提供了比基本数据类型更灵活和强大的功能。集合可以动态调整大小,这意味着您不需要预先知道集合中将要存储多少元素。在C#中,集合通常指的是命名空间下的类,这些类允许您存储强类型的元素集合。基本的集合都在命名空间中,该命名空间下面有几个命名空间,对集合进行分类通用集合,包含用于定义泛型集合的接口和类,可允许用户创建强类型集合。List等线程安全的集合类,提供几个线程安全的集合类,主要用于多个线程访问一个集合的情况,例如等。

海盗Sharp的博客 1193

ObservableCollection和List的区别总结

一、继承的类和接口,还有它们的方法不同 1)ObservableCollection比较简单,继承了Collection, INotifyCollectionChanged, INotifyPropertyChanged   Collection:为泛型集合提供基类。   INotifyCollectionChanged:将集合的动态更改通知给侦听器,例如,何时添加和移除项或者重置整个集合对...

weixin_30578677的博客 97

ObservableCollection 实现添加后排序

按MyClass的Name字段排序 public class EntityObjectMuster : ObservableCollection { /// /// 实现排序插入 /// /// public void AttachItem(MyClass entityObject) {

大黄鸭在发光的专栏 6841

33.C# 集合(Collection)——《跟老吕学C#》

C#支持创建自定义集合类型。通过实现或其他相关接口,你可以定义具有特定行为和功能的集合类型。这为开发者提供了极大的灵活性,可以根据应用程序的需求创建自定义的集合解决方案。虽然C#标准库提供了丰富的集合类型,但在某些特殊情况下,你可能需要自定义集合以满足特定的需求。自定义集合可以通过继承现有的集合类(如List)或实现IList等接口来创建。在自定义集合时,你需要考虑如何实现集合的添加、删除、查找等基本操作,并确保自定义集合的线程安全性和性能。

Python老吕的博客 1419
上一篇: WPF实现简单的颜色调色板功能
下一篇: C#一个完整的Log4net使用实例
RunnerDNA
博客等级 码龄14年 575粉丝 97原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RunnerDNA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值