关闭

win10 uwp 如何让一个集合按照需要的顺序进行排序

标签: uwp
360人阅读 评论(0) 收藏 举报
分类:

虽然这是 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);
            }
        }

可以看到这两个方法的速度都比较好,之前使用的是清除整个列表才添加,可以看到这个方法的速度比上面两个方法差。

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

对map集合进行排序

对map集合进行排序的时候,我们知道map中是按照key-value键值对来存储数据的。那么排序的时候,就会有两种规则,第一种是按照key来排序,第二种是按照value来排序。首先来说下第一种情况,按...
  • Coder__CS
  • Coder__CS
  • 2016-06-19 16:33
  • 2118

java集合进行排序的两种方式

java集合的工具类Collections中提供了两种排序的方法,分别是: Collections.sort(List list)//自然排序 Collections.sort(List list...
  • qgfjeahn
  • qgfjeahn
  • 2016-09-18 11:41
  • 11338

win10 uwp 圆角按钮

本文讲的是如何做圆角按钮,我们在UWP本来的按钮都是矩形,圆角Radius没有,所以本文就用简单方法去做圆角按钮。
  • lindexi_gd
  • lindexi_gd
  • 2016-07-29 17:33
  • 2980

讲讲我在Windows10(uwp)开发中遇到的一些坑

7月29日发布的Windows10正式版,当天安装好以后,在网络不太好的情况下,经过多次尝试终于装上了Visual Studio 2015和Windows 10 10240的SDK.这两周一直在开发U...
  • igweyou
  • igweyou
  • 2015-12-22 10:12
  • 3834

如何对集合中的某一字段进行排序

使用Collections.sort()对List/ArrayList进行排序如何对ArrayList中某个字段进行排序?代码块public class Sort implements Compara...
  • as811105668
  • as811105668
  • 2016-06-28 10:46
  • 252

Set的遍历以及排序详讲

java中Set集合是一个不包含重复元素的Collection,首先我们先看看遍历方法 package com.sort; import java.util.HashSet; import...
  • u014649337
  • u014649337
  • 2015-02-11 15:41
  • 5831

简析Map及Map集合的遍历解析、排序

简析Map及Map集合的遍历解析、排序 扯点犊子: 其实Android对Java基础的要求并不高,虽然Android是基于Java的,但是Android有更多它自己的东西。 但是对于Java基础还是需...
  • yechaoa
  • yechaoa
  • 2017-04-22 16:39
  • 1144

win10 uwp 拖动控件

我们会使用控件拖动,可以让我们做出好看的动画,那么我们如何移动控件,我将会告诉大家多个方法。其中第一个是最差的,最后的才是我希望大神你去用。
  • lindexi_gd
  • lindexi_gd
  • 2017-04-19 20:02
  • 1158

win10 uwp 获得焦点改变

本文讲的是当我们应用失去焦点时,我们获得事件,当我们应用获得焦点,同样获得事件。同时,在应用不可以见时,我们也可以获得。
  • lindexi_gd
  • lindexi_gd
  • 2017-01-01 08:55
  • 1996

.NET/C#中对自定义对象集合进行自定义排序的方法

一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car...
  • liuyuehui110
  • liuyuehui110
  • 2017-04-10 17:03
  • 368
    个人资料
    • 访问:590708次
    • 积分:8765
    • 等级:
    • 排名:第2550名
    • 原创:231篇
    • 转载:16篇
    • 译文:25篇
    • 评论:227条
    博客专栏
    文章分类
    最新评论