需要一些关于排序字符串列表的想法

时间:2013-01-31 22:47:10

标签: c# wpf string sorting

我有C#\ WPF应用程序,它只是在列表框控件中显示变量名称及其值的列表。当用户点击“刷新”按钮时,将使用变量的新值重新创建列表。一些变量可能已经改变,而一些变量保持不变。

我希望自上次刷新以来已更改的值位于列表框的顶部,但无法想到一个优雅的方法来解决这个问题。任何想法或例子都将不胜感激。

谢谢!

5 个答案:

答案 0 :(得分:2)

最好是给你的列表项(模型)一些额外的功能,只是为视图提供服务,viewmodel风格 - 当然,如果你想让它们保持纯净,你可以将你的模型包装在viewmodels中。

例如,您可以为模型提供可以设置的Changed属性(或者,Value属性设置器可以在值更改时自动更改它)。然后,可以使用此属性对ListBox中的项进行排序,方法是对框绑定的集合视图进行排序:

<CollectionViewSource x:Key="SortedModels" Source="{Binding ListOfModels}">
    <CollectionViewSource.SortDescriptions>
        <SortDescription PropertyName="Changed"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

<ListBox ItemsSource="{Binding Source={StaticResource SortedModels}}"/>

假设您的模型实现INotifyPropertyChangedListOfModelsObservableCollection,那就是自动完成排序所需的一切。

答案 1 :(得分:1)

不要使用名称/值对的对象列表,而应将其视为具有Name / Value / IsChanged属性的对象列表。更新对象列表时,您可以适当地设置IsChanged,并在您的排序中使用IsChanged

特别是,不要将此视为排序字符串列表。您有一个变量列表,其中包含属性(namevalueisChanged)。您的列表框绑定到CollectionViewListbox.Items为您提供的,或者您从CollectionViewSource获得的内容)。 CollectionView上有SortDescriptionsIsChanged,您可以先设置Name,然后按{{1}}排序。

答案 2 :(得分:1)

可能有更多选择:

  1. 保持当前列表的状态。加载新列表。使用linq Except查看差异。创建新列表,其中包含顶部Except和下面其余订单的结果。
  2. 使用一些Timestamp扩展您的项目,该项目将在项目创建时进行标记。选择一个间隔,项应该如何位于顶部。读取新值,并将满足条件的值(区间中的最新值)置于顶部。或者您可以按TimeStamp
  3. 对它们进行排序

答案 3 :(得分:1)

使用类似:

var olditems = new Hashset<string>(listbox.items); // or List<T>
List<string> newitems = getNewItems();
newitems = newitems.RemoveAll(x => olditems.Contains(x));
listbox.Items.Clear();
listbox.Items.Add(newitems);
listbox.Items.Add(olditems);

我没有测试过代码,这个想法应该变得清晰。

另请参阅:Using LINQ to remove elements from a List<T>

答案 4 :(得分:0)

我喜欢Jeff的想法,但每次用户更新列表时都需要额外的逻辑来重置IsChanged值。尝试在名称/值对中添加时间戳,并在每次更新值时更新时间戳。然后只需添加时间戳即可。