2018-8-10-win10-uwp-如何让一个集合按照需要的顺序进行排序
2023-09-27 14:28:49 时间
title | author | date | CreateTime | categories |
---|---|---|---|---|
win10 uwp 如何让一个集合按照需要的顺序进行排序 |
lindexi |
2018-08-10 19:16:50 +0800 |
2018-2-13 17:23:3 +0800 |
Win10 UWP |
虽然这是 C# 的技术,但是我是用在 uwp ,于是就把标题写这个名。有一天,我的小伙伴让我优化一个列表。这个列表是 ListView 他绑定了一个 ObservableCollection 所以需要对他做很少的修改。
我绑定一个数量很多的 ObservableCollection 这个ListView 不能做虚拟化,所以性能问题是如果对这个列表做的修改多,那么速度很慢。我知道的就是一个 数组,他是表示修改后的列表需要的顺序。
于是这个数组我叫 sort ,是一个 IList<int>
,他记录了需要排序的顺序
IList<int> sort = new List<int>()
{
0,2,1,3
};
上面的代码就是希望把 2 和 1 的位置换一下,当然,实际的是比较复杂的。于是我寻找了两个方法,简单的方法请看下面
private static void Sort<T>(ObservableCollection<T> list, IList<int> sort)
{
//按照给出的数组排序
var source = list.ToList();
for (int i = 0; i < sort.Count; i++)
{
//假如原来的是 0 1 2
//排序需要 0 2 1
//那么在sort[1]的时候,发现 list[1] = 1 =2 所以需要在 1 的地方插入 2,同时移除 1 ,这个方法可以获得最少改动
//如果当前的值和排序要的不相同
if (list[i].Equals(source[sort[i]]))
{
continue;
}
//拿出排序需要的值,插入到现在的位置
list.Move(sort[i], i);
}
}
这个方法性能很好,可以使用 ObservableCollection 的 CollectionChanged 查看列表修改的数量
第二个方法是使用插入和删除,因为 Move 只有通知列表才有,为了可以使用 List 的,所以就写了第二个方法。
private static void Sort<T>(IList<T> list, List<int> sort)
{
var source = list.ToList();
for (int i = 0; i < sort.Count; i++)
{
if (list[i].Equals(source[sort[i]]))
{
continue;
}
var temp = source[sort[i]];
list.Remove(temp);
list.Insert(i, temp);
}
}
可以看到这两个方法的速度都比较好,之前使用的是清除整个列表才添加,可以看到这个方法的速度比上面两个方法差。
相关文章
- 集合遍历
- wpf 导出Excel Wpf Button 样式 wpf简单进度条 List泛型集合对象排序 C#集合
- Java 集合List、Set、HashMap操作一(Array转List、Set排序、HashMap遍历、Set遍历、List遍历、HashMap大小长度、List打乱顺序)
- java基础—自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序(java集合六)
- Google Earth Engine(GEE) ——Landsat4/5/7/8集合计算指定区域NDVI的Mann Kendall M-K分析(曼肯德尔趋势分析)
- Landsat 数据集合集(Landsat 5/7/8/9)
- 并发集合(四)用优先级对使用阻塞线程安全的列表排序
- 并发集合(二)使用非阻塞线程安全的列表
- Java中集合Set的用法
- python集合类型
- 浅析Java8新特性-Stream流操作:Stream概念、常见中间/终止操作符、创建stream的3种方式、串行流/并行流的区分、使用示例(遍历/匹配、过滤、聚合、映射、归约、归集、统计、分区分组、接合、排序、组合/提取、分页、并行、集合转Map、使用并行流注意点)
- 【Unity3D数据集合】(七)排序列表SortedList和排序字典SortedDictionary学习
- dart使用技巧集合
- Java集合源代码剖析(一)【集合框架概述、ArrayList、LinkedList、Vector】
- 【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)